我遇到了同步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()的情况下正常工作?
答案 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
类的实现细节,但人们开始依靠它,以便语言作者必须记录它。