[英]Are spurios wakeups accompanied by an InterruptedException?
Object.wait
的Javadoc提到,
与一个参数版本一样,可能会产生中断和虚假唤醒,并且此方法应始终在循环中使用。
synchronized (obj) {
while (<condition does not hold>) {
obj.wait(timeout, nanos);
}
... // Perform action appropriate to condition
}
它没有提到需要在此处处理InterruptedException
。 这是否意味着wait方法可以自发地唤醒而不会抛出该方法。
我四处张望,但没有发现有关唤醒实际处理方式的任何具体信息。
由于虚假中断不是问题(或者我已经读过),所以我相信情况就是如此。 我只是在寻找确认。
通常, obj.wait(...)
应该等待,直到有人调用obj.notify()
(或直到达到超时)为止,但是如文档所述:
线程可以唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒。 尽管在实践中这种情况很少发生,但是应用程序必须通过测试应该导致线程唤醒的条件来防范它,并在条件不满足时继续等待。 参见下面的例子
由于虚假唤醒 ,线程可能会在未通知的情况下唤醒。 这就是为什么必须循环检查监视器的保护条件的原因(示例也取自javadoc):
synchronized (obj) {
while (<condition does not hold> and <timeout not exceeded>) {
long timeoutMillis = ... ; // recompute timeout values
int nanos = ... ;
obj.wait(timeoutMillis, nanos);
}
... // Perform action appropriate to condition or timeout
}
如果您使用的是超时,则应检查是否也超过了超时时间。
这与处理中断的异常无关。 那些不会被虚假地抛出,只有当当前线程确实被中断时才抛出。 那就是在您的虚假循环中,您不需要为InterruptedException
添加处理
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.