Java 中线程中断的结果不可重复

Result not repeatable for Thread Interrupt in Java

public class ThreadTest {

    public static void main(String[] args) throws InterruptedException {

        CounterThread ct = new CounterThread();
        ct.setDaemon(true);
        ct.start();

        ct.join(2);

        System.out.println("interrupt status: " + ct.getState()); // key sentence
        if (ct.isAlive()) {
            System.out.println("start interrupt");
            ct.interrupt();
        }

        System.out.println("result: " + ct.getResult());

    }
}

class CounterThread extends Thread {

    private int result;

    public int getResult() {
        return result;
    }

    public void run() {
        for (int i = 0; i < 999999999; i++) {
            if (i == 999999998) {
                result = 5;
                System.out.println("calculate finished");
            }
            if (Thread.interrupted()) {
                result = -1;
                System.out.println("receive interrupt signal");
                return;
            }
        }
    }
}

我使用上面的代码来测试java中断机制。当我注释掉打印语句

System.out.println("interrupt status: " + ct.getState());

结果始终与:

开始中断 接收中断信号 结果:-1

虽然我将其留在代码中,但结果不可重复。结果可以是:

中断状态:RUNNABLE 开始中断 结果:-1 接收中断信号

或者:

中断状态:RUNNABLE 开始中断 结果:0 接收中断信号

无法找出原因,请帮助。谢谢

您的实现存在竞争条件,您在注释掉 System.out.println("interrupt status: " + ct.getState()); 行的情况下获得了可重复的结果只是巧合。问题是线程是 运行 并行的,并且不能保证 CounterThread 中的语句 result = -1; 在主线程中的 System.out.println("result: " + ct.getResult()); 之前执行。

要使结果可重复,您需要等到执行以下块:

if (Thread.interrupted()) {
    result = -1;
    System.out.println("receive interrupt signal");
    return;
}

您可以通过在打印结果之前添加 join() 调用来实现。

ct.join();
System.out.println("result: " + ct.getResult());

在这种情况下,主线程将等待 CounterThread 完成并打印结果。