Java의 notyfy () 와 notifyAll () 의 본질적 차이

4461 단어 javanotifynotifyall
wait() 방법은 현재 자원에 대한 점유권을 포기하고 기다려라. 누군가가 알려줄 때까지 기다려야 뒤에 있는 코드를 실행할 수 있다.
notify () 방법은 현재 라인이 자원에 대한 점유를 포기했음을 나타낸다.
대기하는 라인을 알려 자원에 대한 점유권을 얻지만, 단 하나의 라인만wait상태에서 회복할 수 있습니다.
그리고wait() 뒤에 있는 문장을 계속 실행합니다.
notifyAll () 방법은 현재 라인이 자원에 대한 점유를 포기했음을 나타냅니다.
모든 대기 루트가wait () 방법의 문장부터 실행될 것을 알립니다.
어떤 차이를 읽었습니까?
위의 예는 먼저 nofiyAll()의 예입니다.
Java 코드

package com.thread.wait; 
public class Wait { 
  private int counter = 0; 
  private String name = null; 
  public Wait(int counter,String name){ 
    this.counter = counter; 
    this.name = name; 
  } 
  public synchronized void doSomthing(){ 
    int tempCounter = --counter; 
    if(tempCounter <= 0){ 
      customizedNotifyAll(); 
    } 
    else 
    { 
      while(tempCounter > 0){ 
        try { 
          System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"will invoke WAIT()"); 
          --tempCounter; 
          wait(); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
          notifyAll(); 
        } 
        System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"has been ACTIVED"); 
      } 
      customizedNotifyAll(); 
    } 
  } 
  public void customizedNotifyAll(){ 
    notifyAll(); 
    System.out.println(Thread.currentThread().getName()+"-<"+name+counter+">"+"::"+"INVOKED NOTIFYALL() AND FINISHED"); 
  } 
} 
Java 코드

package com.thread.wait; 
public class TestThread implements Runnable { 
  private Wait wait; 
  public TestThread(Wait wait){ 
    this.wait = wait; 
  } 
  public void run() { 
    wait.doSomthing(); 
  } 
  public static void main(String [] args){ 
    Wait wait = new Wait(4,"DAVID"); 
    Thread t1 = new Thread(new TestThread(wait)); 
    Thread t2 = new Thread(new TestThread(wait)); 
    Thread t3 = new Thread(new TestThread(wait)); 
    Thread t4 = new Thread(new TestThread(wait)); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    t4.start(); 
  } 
} 
실행 결과:

Thread-0-<DAVID3>will invoke WAIT() 
Thread-1-<DAVID2>will invoke WAIT() 
Thread-2-<DAVID1>will invoke WAIT() 
Thread-3-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED 
Thread-0-<DAVID2>has been ACTIVED 
Thread-0-<DAVID2>will invoke WAIT() 
Thread-1-<DAVID1>has been ACTIVED 
Thread-1-<DAVID1>will invoke WAIT() 
Thread-2-<DAVID0>has been ACTIVED 
Thread-2-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED 
Thread-0-<DAVID1>has been ACTIVED 
Thread-0-<DAVID1>will invoke WAIT() 
Thread-1-<DAVID0>has been ACTIVED 
Thread-1-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED 
Thread-0-<DAVID0>has been ACTIVED 
Thread-0-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED 
보셨죠? 일단 notifyAll () 방법을 호출하면 모든 대기 루트는wait () 방법을 호출하는 곳에서 계속 실행됩니다.
이 운행 결과는 매번 다를 수 있습니다. 때로는 두 개의 라인만 실행되고 나머지 두 개의 라인은 다른 라인이 notify All () 방법을 호출하기를 기다리고 있습니다. 때로는 세 개의 라인만 실행되고 다른 하나는 아직 대기 중입니다.
본고는 notify와 notifyAll 방법을 설명하기 때문에 위의 원인에 대해 설명하는 것이 많지 않다.
그 다음은 notify () 방법의 예입니다.
wait 클래스의 customized Notify All () 방법 중의 notify All () 방법을 notify () 방법으로 바꾸는 것입니다
실행 결과:

Thread-1-<DAVID3>will invoke WAIT() 
Thread-0-<DAVID2>will invoke WAIT() 
Thread-2-<DAVID1>will invoke WAIT() 
Thread-3-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED 
Thread-1-<DAVID2>has been ACTIVED 
Thread-1-<DAVID2>will invoke WAIT() 
Did you see that?모든 대기 루트 중 한 개의 루트만 실행이 끝났고, 다른 루트는 바보같이 기다리고 있습니다. Poor guys!
매번 운행하는 결과는 다르지만, 시종 하나의 노선만 운행할 수 있다.
Summary:
notify () 방법은 단지 하나의 라인을wait에서 회복시킬 뿐입니다. 구체적으로 어느 라인인지는 그 라인의 운에 따라 (우선순위를 설정하지 않은 상태에서) 다음 문장을 계속 실행해야 합니다.
notifyAll () 방법은 모든 라인을wait에서 복구하고 다음 문장을 계속 실행하는 것입니다.
위에서 말한 것은 편집자가 여러분께 소개한 자바 중의 notyfy () 와 notify All () 의 본질적인 차이입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기