当使用线程类对象作为锁时,为什么可以调用wait()方法而不调用notify()方法?


public class WaitMain {
public volatile static int i = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(){
public void run(){
for (i = 0; i < 1000000; i++);
}
};
t1.start();
synchronized (t1){
t1.wait();
}

System.out.println(i);
}
}

在上面的代码中,我没有调用任何notify或notifyAll方法,但是主线程仍然被唤醒并正常执行。我想知道为什么。谢谢。

这方面的描述隐藏在Thread.join()的文档中:

当线程终止时,调用this.notifyAll方法。建议应用程序不要在Thread实例上使用waitnotifynotifyAll

结果是这样的:

  • main方法创建一个新的线程t1并启动它
  • 然后调用t1.wait()线程t1在一段时间后终止并隐式调用t1.notifyAll(),根据文档
  • 唤醒主线程

最新更新