Завершение работы ветки Executor после awaitConfimation

Как закрыть все потоки, созданные с помощью ExecutorService после

executor.awaitTermination(1, TimeUnit.DAYS);

закончен?

Это максимальное время, в течение которого потоки могут работать, и если в каком-то случае какой-либо из них не завершит текущую задачу, выключите его и запустите снова.

3 ответа

Решение

Если awaitTermination возвращает true, тогда все потоки были закрыты.

Если awaitTermination возвращает false, тогда некоторые потоки, очевидно, не реагируют на прерывание *, и кроме выхода из процесса Java, вы ничего не можете сделать...

* Если задачи, выполняемые потоками, принадлежат вам, убедитесь, что они реагируют на прерывание, быстро выходя и awaitTermination вернется быстро.

Нет простого способа сделать это. Вы можете использовать ThreadFactory, которая будет создавать потоки демонов, а затем запустить awaitTermination в основной теме, а затем shutdownNow, Это (мы надеемся) отключит всю JVM, и в данной ситуации нет ничего лучше. проведение System.exit() это еще более радикальная мера.

Обратите внимание, что прерывание или даже остановка потоков не гарантирует их фактического завершения.

Вы можете вызвать System.exit(1), чтобы остановить приложение. Если вы не хотите выходить, то вы должны разработать свои задачи так, чтобы они правильно реагировали на Thread.interrupt, другого пути нет.

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