在等待时被通知和中断的线程

时间:2014-09-06 15:33:54

标签: java multithreading

JLS 17.2.4:

  

如果线程 在等待时通知和中断,它可能会   之一:

     

[...]

你能给出一个在等待时被中断和通知的线程的例子吗?我无法理解它是如何可能的,因为当我们打电话时

Thred.interrupt()

obj.notify()

线程将从等待集中删除。由于进一步的呼叫与等待线程无关。它已从等待集中移除。

2 个答案:

答案 0 :(得分:4)

考虑以下代码:

synchronized(obj) {
   obj.notify();
   threadWatingOnObj.interrupt();
}

在执行上述代码的线程释放锁之前,没有通知的线程能够继续。因此,当控制从其obj.wait()调用返回到这样的线程时,它将被通知和中断。

答案 1 :(得分:0)

这看起来像是考试中的问题。你应该填补空白,对吧?

我认为这个问题很难想到,因为“中断”是线程可以进入的状态,“等待”是线程可以进入的状态,但“通知”不是状态。

如果线程在已经处于中断状态时调用wait(),则wait()调用将返回异常。同样,如果一个线程在被中断时处于等待状态,那么wait()调用也将返回异常。

也许当他们说“线程被通知和中断”时,他们意味着线程 等待,并且 被通知,然后中断被传递当线程仍处于wait()调用时,尝试重新获取互斥锁。

我不知道在这种情况下会发生什么,但基于Object.wait()的Javadoc,我希望wait()调用在获取互斥锁后正常返回。