JLS 17.2.4:
如果线程 在等待时通知和中断,它可能会 之一:
[...]
你能给出一个在等待时被中断和通知的线程的例子吗?我无法理解它是如何可能的,因为当我们打电话时
Thred.interrupt()
或
obj.notify()
线程将从等待集中删除。由于进一步的呼叫与等待线程无关。它已从等待集中移除。
答案 0 :(得分:4)
考虑以下代码:
synchronized(obj) {
obj.notify();
threadWatingOnObj.interrupt();
}
在执行上述代码的线程释放锁之前,没有通知的线程能够继续。因此,当控制从其obj.wait()
调用返回到这样的线程时,它将被通知和中断。
答案 1 :(得分:0)
这看起来像是考试中的问题。你应该填补空白,对吧?
我认为这个问题很难想到,因为“中断”是线程可以进入的状态,“等待”是线程可以进入的状态,但“通知”不是状态。
如果线程在已经处于中断状态时调用wait()
,则wait()调用将返回异常。同样,如果一个线程在被中断时处于等待状态,那么wait()调用也将返回异常。
也许当他们说“线程被通知和中断”时,他们意味着线程 等待,并且 被通知,然后中断被传递当线程仍处于wait()调用时,尝试重新获取互斥锁。
我不知道在这种情况下会发生什么,但基于Object.wait()
的Javadoc,我希望wait()调用在获取互斥锁后正常返回。