线程中断:它会取消迎面而来的等待()调用吗?

2022-09-04 07:13:53

我有一个线程,它有一个传入的作业队列(一个包含作业描述的)。当没有要处理的作业时,线程在队列上阻塞 。外部作业调度程序对象在队列中放置新作业时会唤醒它。LinkedListwait()notify()

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


答案 1

是的,中断的线程在调用 wait() 时会抛出一个 InterruptedException。这很容易自己测试。

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

        synchronized(TestInt.class) {
            TestInt.class.wait();
        }    
    }    
}

另外,请注意以下各项的 javaodc:Object.wait()

中断异常 - 如果任何线程在当前线程等待通知之前或期间中断了当前线程。引发此异常时,将清除当前线程的中断状态。


答案 2

阅读 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。

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

如果上述条件均不成立,则将设置此线程的中断状态。

中断不活跃的线程不需要产生任何影响。

因此,将发生的所有情况就是设置线程的中断状态。

编辑

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

抛出:

中断异常 - 如果任何线程在当前线程等待通知之前或期间中断了当前线程。引发此异常时,将清除当前线程的中断状态。


推荐