0

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

一个天真的解决方案是使用一个共享变量terminatePlease,它A会在每次达到稳定状态时进行检查。

代码的原型如下所示:

class A extends Thread {
    boolean terminatePlease;

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

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

4

1 回答 1

3

就是这个想法,是的。布尔值应该是可变的以使此解决方案起作用。

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

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

但请注意,中断处于等待状态的阻塞线程将使阻塞方法抛出 InterruptedException,以便尽快停止运行。如果您不希望这样,请使用 volatile 标志。

于 2013-01-05T14:39:16.810 回答