0

2つのスレッドAとがありB、両方とも実行されているとします。突然B終了することを決定したためAAできるだけ早く終了する必要があります。Aすぐに終了したくないのですが、安定した状態になったら終了します。

単純な解決策は、共有変数を使用することterminatePleaseですA。これは、安定した状態に達するたびにチェックします。

コードのプロトタイプは次のようになります。

class A extends Thread {
    boolean terminatePlease;

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

そのような状況を処理するための他の並行性パターンはありますか?

4

1 に答える 1

3

そうです、そうです。ただし、このソリューションを機能させるには、ブール値を揮発性にする必要があります。

ただし、各スレッドにはすでに割り込みフラグが1つあるため、このフラグも必要ありません。したがってa.interrupt();、スレッドBから呼び出すだけで、スレッドAに次のことを実行させることができます。

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

ただし、待機状態でブロックされたスレッドを中断すると、ASAPの実行を停止するために、ブロックメソッドがInterruptedExceptionをスローすることに注意してください。それが望ましくない場合は、揮発性フラグを使用してください。

于 2013-01-05T14:39:16.810 に答える