public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
如上例,如果wait()
block先进入,notify()
ThreadB中的后续会告诉主线程继续。
但是我们不能保证wait()
会在之前执行notify(
),如果ThreadB先进入块呢?Notify()
将在之前执行wait()
,所以wait()
将永远挂在那里(因为不再notify()
告诉它继续)?通常处理这个问题的正确方法是什么?