Как реализовать пул потоков, который автоматически выключит в конце выполнения?

StackOverflow https://stackoverflow.com/questions/4769429

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

От Javadoc:

Оценка этого потока как поток демона или пользовательский поток. Виртуальная машина Java выходит, когда единственные запущенные потоки - это все потоки демон.

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

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

Runtime.getRuntime().addShutdownHook() было бы то, о чем я бы подумал. http://blog.yohanliyanage.com/2010/10/NKNAKHOTH-JVM-2-SHUTDOWN-HOOKS/ имеет приличное объяснение. Это помогает?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top