Java线程中断标志被清除

时间:2017-02-15 14:03:10

标签: java multithreading interrupt

我正在试验java中的中断,并观察到如果我中断一个线程并且当线程状态从RUNNABLE变为TERMINATED时中断状态没有重置它的中断状态中断变量被重置(中断变为false)

Main.java

public class Main {

public static void main(String[] args) {

    try {

        t1 t1 = new t1();
        t1.start();

        Thread.sleep(10);
        t1.interrupt();
        System.out.println("t1.isInterrupted: " + t1.isInterrupted() + " t1.state: " + t1.getState());
        Thread.sleep(20);
        System.out.println("t1.isInterrupted: " + t1.isInterrupted() + " t1.state: " + t1.getState());

    } catch (Exception exc) {
        System.out.println("Exception: " + exc);
    }

}

}

t1.java

public class t1 extends Thread {

@Override
public void run() {

    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("Processing");
    }

    System.out.println("Execution completed - interrupt status: " + Thread.currentThread().isInterrupted());
}

}

Main.java的输出(Centos 7 64位,Java 1.8.0_66-b17)

  • 处理
    处理
    处理
    t1.isInterrupted:true t1.state:RUNNABLE
    执行完成 - 中断状态:true
    t1.isInterrupted:false t1.state:TERMINATED

我的问题是谁或什么将此标志设置为错误,为什么? Thread类有一个私有的exit方法,它将一些内部变量设置为null但我找不到任何重置中断标志的东西。如果有人能对这个问题有所了解,我将不胜感激......

PS:这是指向GIST

的链接

1 个答案:

答案 0 :(得分:0)

  

我的问题是谁或什么将此标志设置为错误,为什么?

这是线程终止时的已知行为。因为它不再运行,所以中断状态为false。在线程终止之前,中断状态为true,但一旦完成就设置为false。

引用Thread.isInterrupted() javadocs

  

线程中断被忽略,因为在中断时线程不活动将被此方法反映返回false。