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
完成并打印结果。
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
完成并打印结果。