在任何线程死亡之前,它将为所有等待线程引用的对象调用notify



请检查下面的代码,即使我还没有调用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实例上使用waitnotifynotifyAll

关于您的意见

作为您的评论,它将在终止时调用notifyAll(),但如果线程终止,然后我们调用join()方法,就会发生这种情况

以下是java.lang.Thread的最新实现。它还检查Thread#isAlive()。线程完成后,isAlive将返回false

场景如下:线程终止,其内部isAlive标志变为false,并对其调用notifyAll。另一个线程在其上调用join并检查isAlive。由于它返回false,所以对join的调用立即返回。

最新更新