public class Thread04 {
final Object object = new Object();
Runnable rb4 = new Runnable() {
public void run(){
synchronized (object){
System.out.println("T1 start!");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
System.out.println("T1 end!");
}
}
};
Runnable rb5 = new Runnable() {
public void run(){
synchronized (object){
System.out.println("T2 start!");
object.notify();
System.out.println("T2 end!");
}
}
};
public static void main(String[] args) {
Thread04 th = new Thread04();
new Thread(th.rb4).start();
new Thread(th.rb5).start();
}
}
rb5의 object.notify()는 rb4가 아직 잠금을 기다리고 있기 때문에 대기 상태에 진입하지 않은 경우 호출됩니다. 스레드 시작은 자체적으로 즉시 run()을 수행한다는 의미는 아닙니다. 즉, 스레드 이후에 start()하는 스레드의 run()이 먼저 실행될 가능성이 높다는 의미입니다.
rb4
은 작업 중object
의 객체 잠금을 획득하고T1 start!
을 출력한 후wait()
를 호출합니다. 이 메서드를 사용하면rb4
이 정지되고 잠금이 해제되며 동시에 차단됩니다. 이때rb5
는 잠금을 획득하고T2 start!
을 출력합니다. 그런 다음object.notify();
을 호출합니다.rb4
을 실행하려고 했지만rb5
의 잠금이 해제되지 않았으므로rb4
은 여전히 차단되어 있습니다.rb5
계속 실행하고 출력합니다T2 end!
.rb5
작업이 완료되고 잠금이 해제되며rb4
작업이 출력됩니다T1 end!
.