Java의 notyfy () 와 notifyAll () 의 본질적 차이
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 () 의 본질적인 차이입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.