Java spurios唤醒是否伴有中断异常?

Java spurios唤醒是否伴有中断异常?,java,multithreading,spurious-wakeup,Java,Multithreading,Spurious Wakeup,javadoc供参考 在单参数版本中,中断和虚假唤醒是可能的,这种方法应该始终在循环中使用 synchronized(obj){ 而(){ 对象等待(超时,纳秒); } …//执行适合条件的操作 } 这里没有提到需要处理中断异常。 这是否意味着等待方法可能会自动唤醒而不抛出一个 我环顾了一下四周,但没有发现任何关于唤醒过程的具体信息 由于虚假中断不是一件事(或者我已经读过),我相信情况就是这样。我只是想确认一下。通常obj.wait(…)应该等到有人调用obj.notify()(或者等到超时时

javadoc供参考

在单参数版本中,中断和虚假唤醒是可能的,这种方法应该始终在循环中使用

synchronized(obj){
而(){
对象等待(超时,纳秒);
}
…//执行适合条件的操作
}
这里没有提到需要处理
中断异常。
这是否意味着等待方法可能会自动唤醒而不抛出一个

我环顾了一下四周,但没有发现任何关于唤醒过程的具体信息

由于虚假中断不是一件事(或者我已经读过),我相信情况就是这样。我只是想确认一下。

通常
obj.wait(…)
应该等到有人调用
obj.notify()
(或者等到超时时间),但正如文档所述:

线程可以在没有通知、中断或计时的情况下唤醒 一种所谓的虚假唤醒。而这种情况在中国很少发生 实际上,应用程序必须通过测试 导致线程被唤醒的情况,以及 如果条件不满足,则继续等待。参见示例 下面

由于伪唤醒,线程可能会在未收到通知的情况下被唤醒。这就是为什么必须在循环中检查监视器的保护条件(示例也取自javadoc):

synchronized(obj){
而(及){
long-timeoutMillis=…;//重新计算超时值
int nanos=;
对象等待(超时毫秒,纳秒);
}
…//执行适合条件或超时的操作
}
如果使用超时,则应检查是否也超过了超时

这与处理中断的异常无关。这些不会被错误抛出,但只有在当前线程确实被中断时才会抛出。在你的伪循环中,你不需要为InterruptedException添加处理,看看这个:伪唤醒!=假中断。
synchronized (obj) {
    while (<condition does not hold>) {
        obj.wait(timeout, nanos);
    }
    ... // Perform action appropriate to condition
}
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
}