Object.notify()는 임의의 대기 스레드를 선택하고 잠금이 이 릴리스되었음을 알리고 자체에 대한 잠금을 가져올 수 있습니다. Object.notifyAll()은 해당 객체의 잠금 을 기다리는 모든 스레드에 알리고 잠금을 얻기 위해 경쟁합니다.
처음에는 각 스레드에 우선 순위를 변경하면 시퀀스를 제어 할 수 있다고 생각할 수도 있습니다. 그러나 그렇지 않은 경우 우선 순위에 따라 우선 순위가 높은 스레드가 실행되도록 이 보장되는 것은 아닙니다.
그러나 실제로 스레드 실행 순서를 제어하려면 스레드 동기화 도구를 사용하십시오. 에서 [자바 문서]에서
public class NotifyVSNotifyAll {
public static void main(String[] args) {
Object resource = new Object();
Thread a=new Thread(()->{
synchronized (resource) {
System.out.println("A");
try{
Thread.sleep(2000);
resource.notify();
//resource.notifyAll();
}catch(Exception E){}
}
});
Thread b=new Thread(()->{
synchronized (resource) {
System.out.println("B");
}
});
Thread c=new Thread(()->{
synchronized (resource) {
System.out.println("C");
}
});
a.setPriority(10);
b.setPriority(1);
c.setPriority(10);
a.start();
c.start();
b.start();
}
}
Hope its clear.
(https://docs.oracle.com/javase/8/docs/api/java/lang :
우선 순위가 조금 스레드 선택에 말할 것을 테스트하려면 /Object.html#notify--) * "이 객체의 모니터에서 대기중인 단일 스레드를 깨우고 스레드가이 객체를 기다리고 있으면 해당 객체 중 하나가 깨우기 위해 선택됩니다. ** 선택 사항은 임의 ** 스레드는 wait 메소드 중 하나를 호출하여 객체 모니터에서 대기합니다. * " – MadProgrammer여기에서 답변을 찾을 수 있습니다 - https://stackoverflow.com/questions/37026/java-notify- vs-notifyall-over-again – vinS