请检查以下代码,即使我没有调用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()");
}
}
}
答案 0 :(得分:4)
是。 javadoc州
当线程终止时,将调用
this.notifyAll
方法。建议应用程序不要在wait
个实例上使用notify
,notifyAll
或Thread
。
关于你的评论
作为您的评论,它会在
notifyAll()
终止时调用,但会是什么 如果线程被终止,则会发生,之后我们调用join()
方法
Here's最近实施java.lang.Thread
。它还会检查Thread#isAlive()
。线程完成后,isAlive
将返回false
。
方案如下:线程终止,其内部isAlive
标志变为false
,并在其上调用notifyAll
。另一个线程在其上调用join
并检查isAlive
。由于它返回false
,因此对join
的调用会立即返回。