为什么方法wait()在没有notify()的情况下工作?

时间:2014-03-28 16:55:27

标签: java multithreading reflection wait notify

非常感谢提前!

我遇到了同步2个线程的问题:从 StepRunner.java 调用的主线程和线程。我只需要在下一次迭代开始之前显示迭代结果。

我想要的是什么:

Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
2! = 2
Please enter step number [1, 2, 3 or 4] or 5 for exit:

我不想要的东西:

Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
Please enter step number [1, 2, 3 or 4] or 5 for exit: 2! = 2

为此我在 StepRunner.java

中同步了阻止
public void run() {
        thread.start();
        synchronized (thread) {
            try {
                while (thread.isAlive()) { /**Loop is an Oracle's recommendation*/
                    thread.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

但是为什么方法wait()在我的代码的任何地方没有方法notify()的情况下正常工作?

1 个答案:

答案 0 :(得分:4)

Thread's javadoc表示在线程完成时会在内部调用Thread.notifyAll()

  

此实现使用this.wait调用on.isAlive的循环。当一个线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。

如您所见,不建议您使用此功能,您的代码可以按如下方式重写:

thread.start();
try {
    thread.join();    
} catch (InterruptedException e) {
    e.printStackTrace();
}

鉴于此声明仅出现在Java 7 javadoc中,并且建议不要使用此功能,看起来这种行为曾经是Thread类的实现细节,但人们开始依靠它,以便语言作者必须记录它。