Java线程中断标志被清除

3

我正在使用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

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

附言:这里是一个链接到GIST的链接。


“...谁或什么将此标志重新设置为false,以及为什么?” 你为什么关心呢?有人做出了实现决策,所以这就是它的样子。 - ControlAltDel
请查看 https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html。 - mkabanen
2
线程已经结束,因此中断状态将为false。 - Hovercraft Full Of Eels
1
顺便提一下,您需要学习并使用Java命名规范。看到类和变量名称完全相同非常令人困惑。变量名称应以小写字母开头,而类名称应以大写字母开头。学习并遵循这个规范将使我们更好地理解您的代码,并且也能让您更好地理解他人的代码。 - Hovercraft Full Of Eels
1个回答

0
我的问题是:是谁或什么将此标志重新设置为false,以及为什么?
当线程终止时,这是已知的行为。因为它不再运行,中断状态为false. 线程在终止之前中断状态为真,但一旦完成就被设置为false。
引用Thread.isInterrupted() javadocs:

由于线程在中断时不处于活动状态而忽略的线程中断将通过此方法返回false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接