在线程达到稳定状态时发送信号以终止

时间:2013-01-05 14:35:06

标签: java multithreading concurrency concurrent-programming

假设我有两个线程AB,两者都在运行。突然B决定终止A,因此A应该尽快终止。我不希望A立即终止,但是当它达到稳定状态时。

一个天真的解决方案是使用共享变量terminatePleaseA每次达到稳定状态时都会检查它。

代码的原型如下:

class A extends Thread {
    boolean terminatePlease;

    public void run() {
        while (true) {
            if (terminatePlease)
                return;
            doUninterruptableTasks();
        }
    }
}

还有其他并发模式来处理这种情况吗?

1 个答案:

答案 0 :(得分:3)

这个想法,是的。布尔值应该是volatile,以使此解决方案工作。

但你甚至不需要这个标志,因为每个线程已经有一个:中断的标志。所以你可以从线程B中调用a.interrupt();,让你的线程A执行以下操作:

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        doUninterruptableTasks();
    }
}

但请注意,中断在等待状态下阻塞的线程会使阻塞方法抛出InterruptedException,以便停止ASAP运行。如果您不想要,请使用易失性标记。