1

ユーザーがシャットダウン信号をトリガーするまで、別のスレッドの while ループで何かを繰り返し実行するアプリケーションがあります。ワーカー スレッドに (揮発性) ブール値フィールドを設定することで、メイン スレッドからワーカー スレッドにシグナルを送信できますが、「java.util」のユーティリティなどを使用して、スレッドをシャットダウン/中断する他の方法はありますか? 。同時'?

ExecutorService の shutdown() または shutdownNow() メソッドを呼び出してみましたが、ワーカー スレッドを停止できません。また、shutdown() を呼び出し、ここ!Thread.currentThread().isInterrupted()で推奨されているように while 条件で使用すると、ループを中断できません。私が見つけることができる唯一の他の方法は、CountDownLatch を使用することでしたが、ここではwhile ループの条件で使用する必要がありますが、このメソッドの javadoc ドキュメントにはCountDownLatch.getCount() != 0

このメソッドは通常、デバッグおよびテストの目的で使用されます。

これは疑わしいアプローチIMOになります。以下は私のサンプルコードです

class Worker implements Runnable {
    //private volatile boolean shutdown = false; --> alternative to countdownlatch 
    @Override
    public void run() {

        while (countDownLatch.getCount() != 0) {
            //do some work    
        }
    }
}

public class App {
    public static void main(String[] args) {

    System.out.println("Press enter to stop");

    CountDownLatch countDownLatch = new CountDownLatch(1);

    ExecutorService es = Executors.newFixedThreadPool(1);
    es.execute(new Worker(countDownLatch));

    Scanner scanner = new Scanner(System.in);
    scanner.nextLine();

    System.out.println("Shut down signal received");

    countDownLatch.countDown();  //an alternative would be to set a boolean variable in worker

    es.shutdownNow();

}
}

これを行う他のクリーンな方法はありますか?

4

3 に答える 3

2

これを行う他のクリーンな方法はありますか? いいえ。 ( volatile ) ブール値 に固執します。

Thread.stop() が機能すると確信していますが、適切にクリーンアップする機会はありません。interrupted()/isInterrupted() を使用しても機能しますが、ブール値よりも少し複雑です。さらに、中断されたという理由だけでループを終了したくない場合もあります。InterruptedException (または同様のもの) から回復し、ブール値 (または何でも) をチェックし、その値に応じて続行するかどうかを確認するコードがいくつあります。

ブール値は他のものとうまく機能します。中断について言及しました。いつの日か、10 (またはそれ以上) の場所のいずれかでループを停止する 20 の異なる理由があるかもしれません。そのブール値はぴったり収まります。ブール値が true の場合はスレッドが常に停止するように、false の場合はスレッドが停止しないように、またはその他必要なことは何でもコードを簡単に作成できます。

于 2013-12-09T20:02:05.683 に答える