共通のセマフォを使用して実行を制御し、スレッドを頻繁にチェックしたいと思います。
public class MyTask implements Runnable {
private static volatile boolean isDone = false
@Override
public void run() {
while(true) {
if (isDone) {
break;
}
// do some calculation, no wait() s
if (...has result...) {
isDone = true;
break;
}
}
}
}
Thread t1 = new Thread(new MyTask());
Thread t2 = new Thread(new MyTask());
Thread t3 = new Thread(new MyTask());
t1.start();
t2.start();
t3.start();
注意しなければならないのはstatic volatile boolean
変数だけです。すべてのスレッドが同じフラグにアクセスする必要があるためstaticであり、JVM がデータをキャッシュしないようにするためにvolatileです。揮発性としてマークしない場合、コンパイラは、フィールドを一度だけ読み取るようにフィールドからの読み取りを最適化し、ループ実行ごとに保存された値を使用するようなバイトコードを生成する場合があります。
タスクが異なり、異なるループを実装する場合、任意の外部public static volatile boolean
フィールドを使用してフラグを保持できます。
この解決策は、スレッドの待機状態に依存しません。ループ内の複数の場所をチェックできます (すべてのコード ブロックの前でも)。コードが終了チェックに到達することが保証されている場合は、スレッドを中断する必要はありません。isDone