wait()总是抛出InterruptedException

时间:2016-02-18 06:39:00

标签: java multithreading

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

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

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

我尝试过这些随机的事情:

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

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

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

我已检查过中断的标志,并且始终为“假”。

1 个答案:

答案 0 :(得分:1)

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

这称为Inter-thread Communication

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

这意味着拥有锁的活动线程会唤醒其他线程等待(或休眠或阻塞)状态。在获得通知的线程可以继续之前,这个原始线程还必须放弃对对象锁的掌握。

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

请参阅Java Thread lifecycle diagram to for more information

所以在你的情况下:

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

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