请检查下面的代码,即使我还没有调用notify(),它也能正常工作。所以我的问题是,是否有线程会在死之前隐式调用notifyAll()?
class ThreadB extends Thread{
int total;
@Override
public void run() {
super.run();
synchronized (this) {
for(int i=0; i<100; i++)
total += i;
}
}
}
public class ThreadA {
public static void main(String[] args) throws InterruptedException{
ThreadB b = new ThreadB();
b.start();
synchronized (b) {
b.wait();
System.out.println("ThreadA.main()");
}
}
}
是。javadoc声明
当线程终止时,会调用
this.notifyAll
方法。建议应用程序不要在Thread
实例上使用wait
、notify
或notifyAll
。
关于您的意见
作为您的评论,它将在终止时调用
notifyAll()
,但如果线程终止,然后我们调用join()
方法,就会发生这种情况
以下是java.lang.Thread
的最新实现。它还检查Thread#isAlive()
。线程完成后,isAlive
将返回false
。
场景如下:线程终止,其内部isAlive
标志变为false
,并对其调用notifyAll
。另一个线程在其上调用join
并检查isAlive
。由于它返回false
,所以对join
的调用立即返回。