Как я могу переопределить метод await () CountDownLatch в Java?

В настоящее время я работаю над задачей, в которой мне нужно остановить многопоточный процесс, если клиент запросит. Я думал взять флаг статической переменной и инициализировать его значением 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();
}

Также приветствуются любые другие предложения о том, как это реализовать.

Заранее спасибо.

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

JB Nizet 17.11.2018 16:52

Спасибо. Я пройду через это. Также я подумал, могу ли я написать пустой оператор return (return;) в методе выполнения потока, если условие выполняется. Это неправильный способ?

Mayank Yadav 17.11.2018 16:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
43
0

Другие вопросы по теме