2013-08-27 2 views
2

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

executor.awaitTermination(1, TimeUnit.DAYS); 

закончен?

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

ответ

2

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

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

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

+0

Могу ли я каким-то образом определить, какие потоки все еще работают, и закрыть их вручную? – Ivan

+1

@Ivan Нет, он скрыт в рамках реализации ExecutorService. Если бы у вас был доступ к потокам, вы могли бы попытаться остановить их как последнее средство, без гарантии того, что это удастся (и с потенциальными проблемами). – assylias

0

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

+0

Я не хочу разорвать приложение. Он находится в 'while (true)' loop, и мне нужно отключить все потоки, прежде чем повторять цикл. – Ivan

2

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

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

+0

благодарим вас за ответ. Я не хочу полностью отключать всю JVM и приложение. Проблема в том, что некоторые потоки выполняют некоторую работу JDBC, и если какой-либо из них не выполняется, я не могу запустить соединение с этой базой данных. Я могу использовать флаг БД или что-то для этого, если нет лучшего варианта. – Ivan

+1

@Ivan «JDBC Work» должен реагировать на прерывание ... – assylias

+2

@assylias Но классический 'java.io' не прерывается, правильно? Так что он все равно может повеситься. –

Смежные вопросы