Java wait()总是抛出InterruptedException
下面的Java wait()总是抛出InterruptedException,java,multithreading,Java,Multithreading,下面的wait()调用总是抛出中断异常。这并不是说其他线程正在中断它。在调用和抛出异常之间没有延迟。我放了日志来检查调用和捕获异常之间的时间间隔 另外,Thread.sleep(long)也会产生相同的结果 public synchronized void retryConnection() { // . .. some code try { wait(); } catch(InterruptedException e) {
wait()
调用总是抛出中断异常。这并不是说其他线程正在中断它。在调用和抛出异常之间没有延迟。我放了日志来检查调用和捕获异常之间的时间间隔
另外,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”。
中断异常
是使用对象时发生的完全正常的事件。wait()
,和线程.sleep()
与对象.notify()
和对象.notifyAll()
这就是所谓的
拥有对象监视器的线程可以调用object.wait()
——该调用会导致当前线程失去监视器的所有权,并等待/阻止,直到拥有该对象监视器的另一线程调用object.notify()
或object.notifyAll()
这意味着拥有锁的活动线程将其他线程从等待(或休眠或阻塞)状态唤醒。在得到通知的线程可以继续之前,该原始线程还必须放弃对对象锁的抓取
等待锁定的线程接收通知为InterruptedException
。然后,当它接收到异常时,它可以继续,因为它已经被赋予锁的所有权
请看
因此,在你的情况下:
- 接收中断异常并非失败
- Netty试图保持性能,不会让线程等待太长时间,因此您会不断收到通知
- 当运行线程时,不会调用
或notify()
,并且不会引发异常notifyAll()
- 对于
和Object.wait()
这两种方法,您可以从javaDoc获得以下信息: 引发此异常时,当前线程的中断状态将被清除Thread.sleep()