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 楼答案
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
不是失败李>notify()
或notifyAll()
,并且不会引发异常Object.wait()
和Thread.sleep()
,您可以从javaDoc获得以下信息: