В настоящее время я работаю над задачей, в которой мне нужно остановить многопоточный процесс, если клиент запросит. Я думал взять флаг статической переменной и инициализировать его значением false, которое можно было бы время от времени постоянно проверять, и если он станет истинным, мы сможем остановить выполнение потоков.
Один из подходов, которые я ищу, - это переопределить метод await () класса CountDownLatch или метод awaitTermination () класса ExecutorService. Переопределенный метод проверит, неверен ли флаг, затем он вызовет метод базового класса, иначе я мог бы вызвать shutDownNow ().
Примерно так:
ExecutorService executorService =
Executors.newFixedThreadPool(THREADS_COUNT);
CountDownLatch tasksLeft = new CountDownLatch(THREADS_COUNT);
while(i++ < processCount) {
RandomProcessThread thread = new RandomProcessThread(i, someParams);
executorService.submit();
}
tasksLeft.await();
if (shutDownFlagTrue) {
executorService.shutDownNow();
}
@Override
public void await() throws InterruptedException {
if (hasClientRequestedToStop)
shutDownFlagTrue = true;
else
this.await();
}
Также приветствуются любые другие предложения о том, как это реализовать.
Заранее спасибо.
Спасибо. Я пройду через это. Также я подумал, могу ли я написать пустой оператор return (return;) в методе выполнения потока, если условие выполняется. Это неправильный способ?




Это неправильный способ. ExecutrService.submit () возвращает будущее. Future имеет метод cancel (), который при необходимости может прерывать поток, если задача выполняется. И задача может периодически проверять, не прерывается ли текущий поток, чтобы остановить работу как можно скорее. docs.oracle.com/javase/tutorial/essential/concurrency/…