调用 Thread.sleep() 并设置了 *中断状态*?

2022-09-03 05:51:31

Java文档在这一点上并不明确。如果在调用 Thread.sleep() 之前在 Thread 上调用 interrupt,会发生什么情况:

        //interrupt reaches Thread here
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            return;
        }

会抛出中断异常吗

请注明相关文档。


答案 1

是的,它将引发异常。根据 Thread.sleep 的 javadoc,该方法:

抛出:中断异常 - 如果任何线程中断了当前线程。引发此异常时,将清除当前线程的中断状态。

在这种情况下,“有”是一种非正式的表示中断状态的方式。很遗憾,它是非正式的 - 如果有某个地方的规范应该是精确和明确的,那么,它无处不在,但它首先是线程基元。

中断状态机制通常的工作方式是,如果线程在不可中断时(因为它正在运行)时收到中断,则中断实质上是等到线程中断,此时它会突然出现中断异常。这是该机制的一个例子。


答案 2

线程可以在任何时间点中断,但在该线程专门检查其中断状态之前,它不会产生任何影响,或者当它到达时,或者已经被调用阻止,或者其他标准JDK方法(例如包中的那些)。当您捕获 或显式调用时,线程的中断状态将重置(请参阅该难以捉摸的方法的文档)。Thread.currentThread().isInterrupted()Thread.sleep(long)Object.wait(long)InterruptedExceptionjava.nioInterruptedExceptionThread.interrupted()

这篇 JavaSpecialists 文章应该更详细地解释一下线程中断的工作原理以及如何正确处理它们。