Java 다중 스레드 통신의wait,notify의 차이점 상세 설명

다음은 코드를 통해 자바 다중 스레드 통신의wait notify의 차이를 소개합니다. 구체적인 내용은 다음과 같습니다.

class Res{
 public String username;
 public String sex;
}
class Out extends Thread{
 Res res;
 public Out(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  // 
  int count=0;
  while (true){
//   synchronized (res.getClass()){
    if(count==0){// 
     res.username=" ";
     res.sex=" ";
    } else {// 
     res.username=" ";
     res.sex=" ";
    }
    count=(count+1)%2;
//   }
   }
 }
}
class Input extends Thread{
 Res res;
 public Input(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  while (true){
//   synchronized (res.getClass()){
    System.out.println(res.username+","+res.sex);
//   }
  }
 }
}
public class OutInputThread {
 public static void main(String[] args) {
  Res res = new Res();
  Out out = new Out(res);
  Input input = new Input(res);
  out.start();
  input.start();
 }
}
 , 
 , 
 , 
 , 
 , 
 , 
 , 
 , 
 , 
이상의 결과가 나타난다??소비자가 계속 소비하거나 생산자가 계속 생산하다
해결 방법: 생산자 생산이 끝난 후에 소비자가 소비할 수 있고 그렇지 않은 사람은 소비할 수 없다. 소비자가 소비하지 않거나 소비하지 않은 사람은 생산할 수 없고 한 번에 한 번 생산할 수 없다.사실은res공유자원에 대한 조작이 같은 시간에 같은 라인만 조작할 수 있도록 보장하는 것이다.
wait, notify, notifyAll 방법
wait, notify, notifyAll은 Object 클래스에 정의된 세 가지 방법으로 라인의 상태를 제어할 수 있습니다.
이 세 가지 방법이 최종적으로 호출된 것은 모두 jvm급의native 방법이다.jvm 운행 플랫폼에 따라 약간의 차이가 있을 수 있습니다.
만약에 대상이wait 방법을 호출하면 이 대상을 가진 라인이 이 대상의 제어권을 넘겨주고 대기 상태가 됩니다.현재 라인이 운행에서 막힘으로 바뀌어 자원을 방출합니다
대상이 notify 방법을 호출하면 이 대상의 제어권을 기다리는 라인이 계속 실행될 수 있음을 알려 줍니다.이 자물쇠를 가지고 있는 라인을 막힌 상태에서 준비로 바꾸세요.
대상이 notifyAll 방법을 호출하면 이 대상의 제어권을 기다리는 모든 라인이 계속 실행될 것을 알립니다.
주의: 반드시 라인 동기화에서 사용해야 하며, 같은 자물쇠의 자원이어야 한다
다음과 같은 방식으로 수요를 완성할 수 있다.
생산자가 res.getClass 자물쇠를 가져온 후, flag가true 생산자라면res.getClass를 호출합니다.대기합니다. 이 때 다른 라인은 이 자물쇠를 얻을 수 있습니다. 만약flag가false라면 생산을 하고 flag를true로 설정하여 자원 소비를 보장한 후에 재생산을 할 수 있습니다. 그리고 notify를 통해 다른 라인을 깨우쳐 줍니다.

class Res{
 public String username;
 public String sex;
 //true  ,  false , 
 public boolean flag=false;
}
class Out extends Thread{
 Res res;

 public Out(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  // 
  int count=0;
  while (true){
   synchronized (res.getClass()){
    if(res.flag){
     try {
      res.getClass().wait();// , 
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    if(count==0){// 
     res.username=" ";
     res.sex=" ";
    } else {// 
     res.username=" ";
     res.sex=" ";
    }
    count=(count+1)%2;
    res.flag=true;
    res.getClass().notify();
   }
   }

 }
}
class Input extends Thread{
 Res res;
 public Input(Res res){
  this.res=res;
 }

 @Override
 public void run() {
  while (true){
   synchronized (res.getClass()){
    if(!res.flag){
     try {
      res.getClass().wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    System.out.println(res.username+","+res.sex);
    res.flag=false;
    res.getClass().notify();
   }
  }
 }
}
public class OutInputThread {
 public static void main(String[] args) {
  Res res = new Res();
  Out out = new Out(res);
  Input input = new Input(res);
  out.start();
  input.start();
 }
}
출력은 다음과 같습니다.
시아오밍
빨강
시아오밍
빨강
시아오밍
빨강
시아오밍
빨강
notify를 빼면 어떨까요?하나 빼?두 개 빼?
한 생산자를 없애면 여러 개를 인쇄할 수 있지만 (많지도 않다), 소비자를 없애면 하나만 인쇄할 수 있고, 두 개를 없애면 인쇄하지 않을 수도 있고, 한 개를 인쇄할 수도 있기 때문에wait,notify는 반드시 쌍으로 사용해야 한다
wait(동기화 중)와 sleep의 차이점은?
모두 휴면,wait notify 필요
sleep 방법에 대해 우리는 우선 이 방법이 Thread 클래스에 속한다는 것을 알아야 한다.wait 방법은 Object 클래스에 속합니다.
sleep 방법은 프로그램이 지정한 시간을 정지하고 cpu의 다른 라인을 양보하지만 그의 모니터링 상태는 여전히 보유자이며 지정한 시간이 되면 자동으로 실행 상태를 회복합니다.
sleep 방법을 호출하는 과정에서 라인은 대상 자물쇠를 방출하지 않습니다.
wait 방법을 호출할 때 루틴은 대상 자물쇠를 포기하고 이 대상을 기다리는 대기 잠금 탱크에 들어갑니다. 이 대상에 대한 notify 방법을 호출한 후에야 이 루틴은 대상 잠금 탱크에 들어가 대상 자물쇠를 가져와 실행 상태로 들어갈 수 있습니다.
총결산
위에서 말한 것은 여러분이 소개한 자바 다중 스레드 통신의wait,notify의 차이에 대한 상세한 설명입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기