У меня есть несколько вопросов о ExecutorService
и о завершении работы. Мой случай использования: Я использую ExecutorService
нереститься фиксированное число потоков, чей пробег способ выглядеть следующим образом:ExecutorService ждут сигнала завершения работы в экземпляре Runnable
while (true) {
try {
this.currentThreadRunning = true;
processMessage();
}
catch (Throwable e) {
// Keeping the thread alive despite exceptions.
}
}
Эти потоки выполняются бесконечно, опрос для сообщений.
Что я пытаюсь сделать? Я обрабатываю очередь SQS для сообщений и обрабатываю их.
Очевидно, что в моем случае метод останова ExecutorService's
не будет работать. Когда вызывается shutdownNow()
, все мои потоки прерываются бесцеремонно. Я ненавижу это!
Есть ли способ вызвать awaitTermination
и проверить в моем Runnable
экземпляре (в блоке finally?), Если выключение было инициировано и активировано для текущего потока?
ОБНОВЛЕНИЕ: Я переработал свой код для выполнения опроса, а затем создавал потоки для их обработки. Таким образом, метод запуска экземпляра Runnable не должен быть бесконечным циклом. И awaiTermination
приведет к определенному закрытию нитей. И, конечно же, я вызвал shutdownNow
после awaitTermination
.
Чтобы создать бесконечное количество потоков, вам нужно бесконечное количество ядер и памяти процессора. У вас есть это? –
Обычным использованием исполнителя будет создание новой задачи для каждого обрабатываемого сообщения. – SpaceTrucker
@Sleiman - существует фиксированное количество потоков. Но они бегут бесконечно. Я обновлю вопрос, чтобы соответствующим образом отразить сценарий. – user657592