繁体   English   中英

spurios唤醒是否伴随InterruptedException?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM