我正在学习Java多线程编程,最难的部分似乎是线程间通信,使用wait()
、notify()
和notifyAll()
。
我引用了 wait()
的官方 Javadoc,转载于此:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
我明白了,当线程 t
调用 wait()
时,它会立即释放锁然后等待;但是我无法理解 while loop
中的条件是什么意思?在线程 t
检查 while 循环
中的条件之前,是否有机会检查条件是否已被其他线程修改?
谁能告诉我这个条件
是什么,以及在while
循环中使用哪些基本的东西来检查条件?
最佳答案
您不仅需要循环它,还需要检查循环中的条件。 Java 不保证您的线程只会被 notify()/notifyAll() 调用或正确的 notify()/notifyAll() 调用唤醒。由于此属性,无循环版本可能会在您的开发环境中正常工作,但在生产环境中会意外失败。
例如,你正在等待某事:
synchronized (theObjectYouAreWaitingOn) {
while (!carryOn) {
theObjectYouAreWaitingOn.wait();
}
}
一个邪恶的线程出现并且:
theObjectYouAreWaitingOn.notifyAll(); 如果邪恶的线程没有/不能干扰 carryOn,你就继续等待合适的客户端。
编辑:添加了更多样本。等待可以被中断。它抛出 InterruptedException,您可能需要将等待包装在 try-catch 中。根据您的业务需要,您可以退出或抑制异常并继续等待。
为了您的清晰度,也请检查下面的一项。
wait 和 notify 用于实现[条件变量]( http://en.wikipedia.org/wiki/Monitor_(synchronization)#Blocking_condition_variables ),因此您需要在继续之前检查您正在等待的特定谓词是否为真。
关于java - 在 while 循环中检查 wait() 的什么条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48744746/