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

时间:2014-11-02 07:24:37

标签: java android

请检查以下代码,即使我没有调用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()");
        }
    }
}

1 个答案:

答案 0 :(得分:4)

是。 javadoc

  

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

关于你的评论

  

作为您的评论,它会在notifyAll()终止时调用,但会是什么   如果线程被终止,则会发生,之后我们调用join()方法

Here's最近实施java.lang.Thread。它还会检查Thread#isAlive()。线程完成后,isAlive将返回false

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