Как реализовать пул потоков, который будет автоматически отключаться в конце выполнения? - PullRequest
2 голосов
/ 22 января 2011

Я пишу Java-клиент, который теоретически может быть использован в другой среде: main () Java, в контейнере сервлета или через внедрение зависимостей.

Клиент реализует пул потоков внутреннего соединения.

Проблема с этим подходом заключается в том, что пользователи клиента, которые не знают о том, что реализован внутренний пул потоков, увидят, что его или ее приложение "зависло" при завершении работы. Мои пользователи должны знать, чтобы отправить сообщение shutdown () в библиотеку.

Мне интересно, можно ли использовать какой-либо другой альтернативный подход, который, с одной стороны, позволил бы мне запустить пул потоков для моих соединений; и, с другой стороны, перехватить какое-то событие, возможно, событие JVM, которое указывает на сбой JVM, что позволит мне вызвать мою реализацию shutdown ().

Ответы [ 3 ]

5 голосов
/ 22 января 2011

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

Я считаю, что если вы пометите свои отдельные потоки как "daemons "(через метод Thread.setDaemon), тогда JVM не будет поддерживать работу, если останутся только потоки демонов.

Из JavaDoc:

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

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

2 голосов
/ 22 января 2011

Runtime.getRuntime().addShutdownHook() было бы тем, о чем я бы подумал. http://blog.yohanliyanage.com/2010/10/know-the-jvm-2-shutdown-hooks/ имеет достойное объяснение. Это помогает?

0 голосов
/ 15 июня 2013

Если проблема заключается в том, что пользователи вашего кода не знают, что необходимо отключить пул потоков, возможно, решение состоит в том, чтобы сообщить им об этом?В фабричном методе или конструкторе для соответствующего класса укажите ExecutorService для использования в качестве аргумента, чтобы вызывающая сторона отвечала за его жизненный цикл.То есть используйте внедрение зависимостей для продвижения политики вверх.

...