有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java wait()总是抛出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(服务器)线程时,它会失败,但如果它来自其他java线程,它会工作。所以我的问题是:是否存在任何机制或线程状态,其中wait()Thread.sleep()被禁止并在调用时抛出异常

我已经检查了中断标志,它总是“false”


共 (1) 个答案

  1. # 1 楼答案

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

    这被称为Inter-thread Communication

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

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

    等待锁定的线程以InterruptedException的形式接收通知。然后,当它接收到异常时,它可以继续,因为它已经被赋予锁的所有权

    请参阅Java Thread lifecycle diagram to for more information

    因此,在你的情况下:

    • 接收InterruptedException不是失败
    • Netty试图保持性能,不会让线程等待太长时间,因此您会不断收到通知
    • 运行线程时,不会调用notify()notifyAll(),并且不会引发异常
    • 对于Object.wait()Thread.sleep(),您可以从javaDoc获得以下信息:

      The interrupted status of the current thread is cleared when this exception is thrown.