繁体   English   中英

wait() 总是抛出 InterruptedException

[英]wait() is always throwing InterruptedException

下面的wait()调用总是抛出InterruptedException 并不是其他线程正在中断它。 在调用和抛出异常之间没有延迟。 我已经放置了日志来检查调用和捕获异常之间的时间间隔。

此外, Thread.sleep(long)产生相同的结果。

public synchronized void retryConnection()
{
// . .. some code
    try
    {
        wait();
    }
    catch(InterruptedException e)
    {
        log(Level.SEVERE, "InterruptedException " , e);
    }
// . .. some code
}

我试过这些随机的东西:

在新线程中调用此方法。 然后它工作正常。 它是一种等待和通知机制也有效。

再次放入相同的代码,即捕获异常后再次等待。 然后它正在等待。

观察:当调用来自 netty(server) 线程时,它会失败,但如果它来自某个其他 java 线程,则它可以工作。 所以我的问题是:是否有任何机制或线程状态禁止wait()Thread.sleep()并在调用它们时抛出异常?

我检查了中断标志,它总是“假”。

InterruptedException是在使用Object.wait()thread.sleep()Object.notify()Object.notifyAll()时发生的完全正常的事件。

这称为线程间通信

拥有对象监视器的线程可以调用Object.wait() - 该调用会导致当前线程失去监视器的所有权并等待/阻塞,直到拥有所述对象监视器的另一个线程调用Object.notify()Object.notifyAll()

这意味着拥有锁的活动线程将其他线程从等待(或睡眠或阻塞)状态唤醒。 在收到通知的线程可以继续之前,这个发起线程还必须放弃对对象锁的控制。

等待锁的线程接收通知为InterruptedException 然后它可以继续进行,因为在它收到异常时,它已经获得了锁的所有权。

有关详细信息,请参阅Java 线程生命周期图

所以在你的情况下:

  • 接收InterruptedException不是失败。
  • Netty 试图提高性能,不会让线程等待太久,因此您不断收到通知。
  • 当您运行线程时,您不会调用notify()notifyAll()并且永远不会抛出异常
  • 对于Object.wait()Thread.sleep()你得到以下(来自 javaDoc):

    抛出此异常时清除当前线程的中断状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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