スレッドの 1 つがタスクを正常に終了した場合に、スレッドのグループをキャンセルするシナリオの解決策を見つけようとしています。
シナリオは次のようなものです。スレッドのグループがファイル内の文字列を検索するタスクに取り組んでおり、いずれかのスレッドが文字列を見つけた場合、残りのスレッドは実行を停止する必要があるとします。
1.5 の同時実行性を使用するとこれを実現できますが、JDK 1.5 より前では、この種のシナリオを実現したい場合、どうすればそれを実現できるでしょうか?
スレッドの 1 つがタスクを正常に終了した場合に、スレッドのグループをキャンセルするシナリオの解決策を見つけようとしています。
シナリオは次のようなものです。スレッドのグループがファイル内の文字列を検索するタスクに取り組んでおり、いずれかのスレッドが文字列を見つけた場合、残りのスレッドは実行を停止する必要があるとします。
1.5 の同時実行性を使用するとこれを実現できますが、JDK 1.5 より前では、この種のシナリオを実現したい場合、どうすればそれを実現できるでしょうか?
スレッドを停止する良い方法は、継続するかどうかを示すフラグを定期的にチェックすることです。bennihepp が回答で指摘しているように、java Thread クラスには既に割り込みと呼ばれる機能があり、多くのシナリオで役立ちます。Thread クラス、特にinterrupt()およびisInterrupted()メソッドについては、javadoc を参照してください。
次の例では、実行可能なクラスは、1 つのインスタンスが終了した後、すべてのインスタンスが (すぐに) 停止することを確認します。作業単位 (ループの 1 回の反復) を十分に小さく保つ必要があることに注意してください。
public class MyRunnable implements Runnable {
private static boolean shouldStop = false;
public void run() {
// allocate required resources
while (!MyRunnable.shouldStop) {
// do work
if (/* some condition to indicate completion */)
MyRunnable.shouldStop = true;
}
// release any allocated resources
}
}
この単純な例では、すべてのスレッドが同じタイプの実行可能なオブジェクトをラップしていると想定しています。1 つがshouldStop
フラグを設定すると、他のすべても停止します。この例を拡張して中断を容易にすることは非常に簡単です。
スレッドのタスクを小さなチャンクに分割しstop
、ループ内の状態をチェックするだけではどうですか?