为什么 Thread.isInterrupted () 总是返回 false?

2022-09-01 12:36:08

我发现了JavaDoc的方法:

返回:如果此线程已中断,则返回 true;否则为假。

我认为我对方法的理解有些问题。此外,我可能误解了Thread中的“中断”概念。

欢迎任何解释!谢谢!

代码片段:

在线程定义中:

public void run() {
        try {
            //Do something
        } catch (InterruptedException e) {
            System.out.println(isInterrupted());//Always false
            return;
        }
    }

调用:

theThread.interrupt();

答案 1

此行为通常记录在引发该异常的方法中。例如,javadoc 说:Object.wait()

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

事实上,异常本身的javadoc是这样说的:

“有时,方法可能希望测试当前线程是否已中断,如果是,则立即引发此异常。以下代码可用于实现此效果:

if (Thread.interrupted())  // Clears interrupted status!
     throw new InterruptedException();

请注意它们如何强调在引发异常之前清除该标志。


为什么它被设计成这样工作?你必须问设计师,但我希望他们认为异常处理程序应该处理这种情况,因此应该不需要在那个时候仍然设置标志。(如果处理程序不能完全处理这种情况,它可以重新引发异常,也可以调用以再次设置标志。Thread.getCurrentThread.interrupt()


答案 2

引发异常后,线程将不再处于中断状态。


推荐