假设我有两个线程A
和B
,两者都在运行。突然B
决定终止A
,因此A
应该尽快终止。我不希望A
立即终止,但是当它达到稳定状态时。
一个天真的解决方案是使用共享变量terminatePlease
,A
每次达到稳定状态时都会检查它。
代码的原型如下:
class A extends Thread {
boolean terminatePlease;
public void run() {
while (true) {
if (terminatePlease)
return;
doUninterruptableTasks();
}
}
}
还有其他并发模式来处理这种情况吗?
答案 0 :(得分:3)
这个想法,是的。布尔值应该是volatile,以使此解决方案工作。
但你甚至不需要这个标志,因为每个线程已经有一个:中断的标志。所以你可以从线程B中调用a.interrupt();
,让你的线程A执行以下操作:
public void run() {
while (!Thread.currentThread().isInterrupted()) {
doUninterruptableTasks();
}
}
但请注意,中断在等待状态下阻塞的线程会使阻塞方法抛出InterruptedException,以便停止ASAP运行。如果您不想要,请使用易失性标记。