4

我在线程 A上有一个对象正在调用,而线程 Bwait()上的另一个对象做了一些工作,然后调用线程 A的对象。线程 A 然后执行一些后处理。notify()

我的问题很简单:

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

4 回答 4

10

当一个线程等待 usingwait()时,他实际上是在等待notify(). 所以一旦notify()被另一个线程调用,这个线程将继续,如果你调用interrupt(),你会得到异常。

此外,从您链接到的文档中:

使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法

notify从锁中释放线程。

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

 

于 2011-05-19T06:18:13.163 回答
3

notify()wait()投掷InterruptedExceptionnotify()让我们wait()继续正常的程序流程。

于 2011-05-19T06:17:31.067 回答
2

notify()对于正在执行的线程来说,这不是异常终止wait()。例如,如果线程在notify()被调用之前被终止——而不是notify()被调用的结果,你会得到异常。线程没有被中断——它被唤醒了。

于 2011-05-19T06:16:43.420 回答
0

请注意,您在该代码中有一个错误。等待应始终在循环中调用,并在唤醒后检查条件。

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

于 2011-05-19T06:19:08.250 回答