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

卢声远*_* Lu 20 java concurrency multithreading

我找到了JavaDoc的方法:

返回:如果此线程已被中断,则返回true; 否则是假的.

我认为我对这种方法的理解有些不对劲.此外,我可能会误解Thread中的"中断"概念.

欢迎任何解释!谢谢!

代码段:

在线程定义中:

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

引用:

theThread.interrupt();
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 35

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

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

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

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

if (Thread.interrupted())  // Clears interrupted status!
     throw new InterruptedException();
Run Code Online (Sandbox Code Playgroud)

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


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

  • +1; 我认为这应该被标记为正确的答案:) (3认同)

cdh*_*wie 17

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


Boh*_*ian 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(); // 
    }
}
Run Code Online (Sandbox Code Playgroud)