Java wait()不会抛出InterruptedException

时间:2011-05-19 06:14:17

标签: java concurrency synchronization wait notify

我在线程A 上有一个调用wait()的对象,而线程B 上的另一个对象执行某些操作然后调用线程A 的对象是notify()。线程A然后执行一些后处理。

我的问题很简单:

synchronized(this)
{
    while(!flag)
    {
        try
        {
            wait();
            getLogger().info("No longer waiting");
        }
        catch (InterruptedException ie)
        {
            getLogger().info("Wait threw InterruptedException");
        }
    }
}

导致信息消息“不再等待”而不是“等待抛出InterruptedException”。

我很困惑,因为这个(http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()):

  

投掷:

     

InterruptedException - 如果另一个线程中断了   当前线程在等待当前线程之前或当前线程   通知。清除当前线程的中断状态   抛出此异常时。

为什么我会出现奇怪的行为?

感谢。

4 个答案:

答案 0 :(得分:10)

当线程等待wait()时,他实际上等待notify()。因此,一旦另一个线程调用notify(),该线程将继续,如果您将调用interrupt(),您将获得异常。

另外,从您链接的文件:

  

导致当前线程等到   另一个线程调用notify()   方法或notifyAll()方法   这个对象

notify从锁中释放线程。

  

InterruptedException - 如果是另一个   线程中断了当前线程   在当前线程之前或之时   等待通知。

答案 1 :(得分:3)

notify()不会wait()抛出InterruptedExceptionnotify()wait()继续正常的计划流程。

答案 2 :(得分:2)

对于notify()的线程,

wait()不是异常终止。例如,如果线程在notify()被调用之前终止,则会得到异常 - 而不是notify()被调用的结果。线程没有被打断 - 它被唤醒了。

答案 3 :(得分:0)

请注意,您的代码中存在错误。应始终在循环中调用Wait,并在唤醒后检查条件。

等待可以被虚假的唤醒唤醒。请参阅javadoc wait()