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

时间:2011-08-22 02:39:20

标签: java multithreading concurrency

我找到了JavaDoc的方法:

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

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

欢迎任何解释!谢谢!

代码段:

在线程定义中:

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

调用:

theThread.interrupt();

4 个答案:

答案 0 :(得分:35)

此行为通常记录在抛出该异常的方法中。例如,Object.wait()的javadoc表示:

  

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

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

  

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

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

注意他们强调如何在抛出异常之前清除标志


为什么它的设计是这样的?您必须询问设计人员,但我希望他们认为异常处理程序应处理情况,因此应该不需要在该点设置该标志。 (如果处理程序没有完全处理这种情况,它可以重新抛出异常,或者调用Thread.getCurrentThread.interrupt()再次设置标志。)

答案 1 :(得分:16)

抛出异常后,线程不再处于中断状态。

答案 2 :(得分:6)

添加到cdhowie的答案,一个标准模式是让Thread处理中断。这对于Executors很有用,当运行的代码不“拥有”线程时,不应该妨碍中断(除非你真的知道你在做什么)

public void run() {
    try {
        //Do something
    } catch (InterruptedException e) {
        // Do whatever local clean up you need to
        ...
        // Then let the owning Thread know it's been interrupted, so it too can clean up
        Thread.currentThread().interrupt(); // 
    }
}

答案 3 :(得分:1)

您可以在自己的代码中检查isInterrupted(),例如从循环中检查。如果线程被中断,则可以抛出InterruptedException以停止执行。

在您的示例中,如果您发现InterruptedException,您可以确定它已被中断,您不必检查该方法。