[英]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
。 然后它可以继续进行,因为在它收到异常时,它已经获得了锁的所有权。
所以在你的情况下:
InterruptedException
不是失败。notify()
或notifyAll()
并且永远不会抛出异常Object.wait()
和Thread.sleep()
你得到以下(来自 javaDoc):
抛出此异常时清除当前线程的中断状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.