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();
}
}
PHP中文网2017-04-18 10:55:24
rb5의 object.notify()는 rb4가 아직 잠금을 기다리고 있기 때문에 대기 상태에 진입하지 않은 경우 호출됩니다. 스레드 시작은 자체적으로 즉시 run()을 수행한다는 의미는 아닙니다. 즉, 스레드 이후에 start()하는 스레드의 run()이 먼저 실행될 가능성이 높다는 의미입니다.
迷茫2017-04-18 10:55:24
rb4
은 작업 중 object
의 객체 잠금을 획득하고 T1 start!
을 출력한 후 wait()
를 호출합니다. 이 메서드를 사용하면 rb4
이 정지되고 잠금이 해제되며 동시에 차단됩니다. 이때 rb5
는 잠금을 획득하고 T2 start!
을 출력합니다. 그런 다음 object.notify();
을 호출합니다. rb4
을 실행하려고 했지만 rb5
의 잠금이 해제되지 않았으므로 rb4
은 여전히 차단되어 있습니다. rb5
계속 실행하고 출력합니다T2 end!
. rb5
작업이 완료되고 잠금이 해제되며 rb4
작업이 출력됩니다T1 end!
.