提前感谢!
我在同步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
类的一个实现细节,但是人们开始依赖它,所以语言作者不得不记录它。