线程中断:是否会取消即将到来的wait()调用?

我有一个具有传入作业队列的线程(包含作业描述的LinkedList )。 当没有工作要做时,线程在队列上阻塞wait() 。 外部作业调度程序对象在将新作业放入队列时使用notify()唤醒它。

在关闭我的程序时,我调用Thread上的interrupt() 。 当线程等待wait()作业时,这会引发InterruptedException 。 我的问题是:如果我在没有阻塞但是做某种工作的情况下中断线程会发生什么,处理后的项目是队列中的最后一个(所以队列现在是空的)并且执行在中断之前超过了isInterrupted()检查标志是否已设置,因此它再次调用wait() ? 是否会抛出InterruptedException因为已经设置了中断标志或者线程永远等待,因为新的作业永远不会到达队列并且没有人可以中断等待?

是的,您的被中断的线程将在调用wait()时抛出InterruptedException。 这对你自己来说非常简单。

 public class TestInt { public static void main(String[] args) throws Exception { Thread.currentThread().interrupt(); synchronized(TestInt.class) { TestInt.class.wait(); } } } 

另外,请注意Object.wait()的javaodc:

InterruptedException – 如果任何线程在当前线程等待通知之前或当前线程中断当前线程。 抛出此exception时,将清除当前线程的中断状态。

阅读Thread.interrupt()的API规范 –

中断此线程。

除非当前线程正在中断自身(始终允许),否则将调用此线程的checkAccess方法,这可能导致抛出SecurityException。

如果在调用Object类的wait(),wait(long)或wait(long,int)方法或者join(),join(long),join(long,int)的方法中阻塞了这个线程,sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。

如果此线程在可中断通道上的I / O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,并且线程将收到ClosedByInterruptException。

如果此线程在Selector中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能具有非零值,就像调用选择器的唤醒方法一样。

如果以前的条件都不成立,则将设置该线程的中断状态。

中断不活动的线程不会产生任何影响。

因此,所有将要发生的是线程的中断状态将被设置。

编辑

如果您阅读了Object.wait()的API规范,您将看到以下内容 –

抛出:

InterruptedException – 如果任何线程在当前线程等待通知之前或当前线程中断当前线程 。 抛出此exception时,将清除当前线程的中断状态。