为什么方法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()在我的代码的任何地方?

Thread的javadoc声明Thread.notifyAll()在线程完成时被内部调用:

这个实现使用了This的循环。wait调用以this.isAlive为条件。当线程终止this时。调用notifyAll方法。建议应用程序不要在Thread实例上使用wait、notify或notifyAll。

如你所见,不建议使用这个特性,你的代码可以这样重写:
thread.start();
try {
    thread.join();    
} catch (InterruptedException e) {
    e.printStackTrace();
}

考虑到这个语句只出现在Java 7 javadoc中,建议不要使用这个功能,看起来这个行为曾经是Thread类的一个实现细节,但是人们开始依赖它,所以语言作者不得不记录它。

最新更新