Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java wait()总是抛出InterruptedException_Java_Multithreading - Fatal编程技术网

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()
    Thread.sleep()
    这两种方法,您可以从javaDoc获得以下信息: 引发此异常时,当前线程的中断状态将被清除