1

Object.wait用于提及的 javadoc ,

与单参数版本一样,中断和虚假唤醒是可能的,并且此方法应始终在循环中使用。

synchronized (obj) {
    while (<condition does not hold>) {
        obj.wait(timeout, nanos);
    }
    ... // Perform action appropriate to condition
}

它没有提到InterruptedException这里需要处理 a 。这是否意味着等待方法可能会自发唤醒而不会抛出一个。

我环顾四周,但没有找到任何关于唤醒实际处理方式的具体信息。

由于虚假中断不是一件事(或者我已经读过),我相信情况就是如此。我只是在寻找对此的确认。

4

1 回答 1

3

通常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

于 2019-09-04T12:11:33.493 回答