java线程中断:它会取消即将到来的wait()调用吗?
我有一个线程,它有一个传入的作业队列(包含作业描述的LinkedList
)。当没有作业可处理时,线程在队列上用wait()
阻塞。当外部作业调度程序对象在队列上放置新作业时,它会用notify()
唤醒它
在程序关闭时,我调用线程上的interrupt()
。当线程在wait()
中等待作业时,会引发InterruptedException
。我的问题是:如果我在线程不阻塞但执行某种工作时中断线程,那么会发生什么情况?已处理的项是队列中的最后一个(因此队列现在为空),并且在设置中断标志以便再次调用wait()
之前,执行通过了isInterrupted()
检查?它是否会抛出一个InterruptedException
,因为中断标志已经设置,或者线程永远等待,因为新作业永远不会到达队列,并且没有人中断等待
# 1 楼答案
阅读^{} -
因此,将要发生的只是设置线程的中断状态
编辑
如果阅读^{} 的API规范,您将看到以下内容:
# 2 楼答案
虽然这是一个很老的问题,但我想补充一点,如果在(没有锁,它无法继续,甚至无法处理异常)
lock.wait()
期间调用Thread.currentThread().interrupt()
方法(当线程处于WAITING
状态时),这并不意味着线程将在内部立即抛出InterruptedException
,第一个线程将进入BLOCKED
状态(它将被另一个线程的lock.notify()/notifyAll()
调用唤醒,这允许它竞争共享锁),中断标志设置为true,可能在一段时间后,只有在再次获得锁后(有时相当长的时间),它才能抛出^{请参阅下面的日志,因为您可以看到其他线程继续工作,而
BLOCKING
状态下带有标志isInterrupted
的th4被设置为true(在调用Thread.currentThread().interrupt()
方法之后)# 3 楼答案
是的,被中断的线程在调用wait()时将抛出InterruptedException。这很容易自己测试
另外,请注意
Object.wait()
的javaodc: