下面的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()的机制或线程状态,如果调用它们则抛出异常?
我已检查过中断的标志,并且始终为“假”。
答案 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
不是失败。notify()
或notifyAll()
并且永远不会抛出异常Object.wait()
和Thread.sleep()
,您都可以获得以下内容(来自javaDoc):
抛出此异常时,将清除当前线程的中断状态。