У меня есть приложение, которое многократно запускает что-то в цикле while в отдельном потоке, пока пользователь не активирует сигнал выключения. Я могу отправить сигнал из основного потока в рабочий поток, установив (изменчивое) логическое поле в рабочем потоке, но есть ли другой способ выключить / прервать поток, например с помощью какой-нибудь утилиты из java.util.concurrent?
Я попытался вызвать метод shutdown () или shutdownNow () ExecutorService, но им не удалось остановить рабочий поток. Также вызывается shutdown () и используется !Thread.currentThread().isInterrupted()
в условии while, как рекомендуется здесь не может разорвать цикл. Единственный другой способ, который я мог найти, - это использовать CountDownLatch, но здесь мне пришлось бы использовать CountDownLatch.getCount() != 0
в условии для цикла while, но в документации javadoc этого метода говорится
Этот метод обычно используется для отладки и тестирования.
что делает сомнительный подход ИМО. Ниже мой пример кода
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();
}
}
Есть ли другой чистый способ сделать это?