ユーザーがシャットダウン信号をトリガーするまで、別のスレッドの 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();
}
}
これを行う他のクリーンな方法はありますか?