我在线程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 - 如果另一个线程中断了 当前线程在等待当前线程之前或当前线程 通知。清除当前线程的中断状态 抛出此异常时。
为什么我会出现奇怪的行为?
感谢。
答案 0 :(得分:10)
当线程等待wait()
时,他实际上等待notify()
。因此,一旦另一个线程调用notify()
,该线程将继续,如果您将调用interrupt()
,您将获得异常。
另外,从您链接的文件:
导致当前线程等到 另一个线程调用notify() 方法或notifyAll()方法 这个对象
notify
从锁中释放线程。
InterruptedException - 如果是另一个 线程中断了当前线程 在当前线程之前或之时 等待通知。
答案 1 :(得分:3)
notify()
不会wait()
抛出InterruptedException
。 notify()
让wait()
继续正常的计划流程。
答案 2 :(得分:2)
notify()
的线程, wait()
不是异常终止。例如,如果线程在notify()
被调用之前终止,则会得到异常 - 而不是notify()
被调用的结果。线程没有被打断 - 它被唤醒了。
答案 3 :(得分:0)
请注意,您的代码中存在错误。应始终在循环中调用Wait,并在唤醒后检查条件。
等待可以被虚假的唤醒唤醒。请参阅javadoc wait()