Что происходит со спящими потоками при завершении работы контейнера?

#java #multithreading #tomcat #concurrency

#java #многопоточность #tomcat #параллелизм

Вопрос:

Предположим

Контейнер tomcat, в котором запущено веб-приложение.

Запустите команду завершения работы tomcat.

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

Комментарии:

1. Если контейнер остановлен, то, очевидно, потоки даже больше не существуют. Поток Java не может сохраниться в своей JVM.

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

3. это имеет смысл. В следующий раз я постараюсь написать более точные вопросы.

4. @JBNizet: это не относится к потокам, не являющимся демонами, которые вы преднамеренно создаете и полностью управляете самостоятельно в коде JSP / Servlet. Что является ужасно плохой идеей в контейнере Java EE.

Ответ №1:

Если в Tomcat нет магии, о которой я не знаю (возможно), проблема, вероятно, в том, что ваши спящие потоки не являются потоками демонов. Как только завершение работы JVM инициировано (с помощью внешнего сигнала HUP / INT / TERM, или System.exit, или любым другим способом), JVM будет ждать, пока все потоки, не связанные с демоном, завершатся нормально. Вам нужно будет организовать упорядоченное завершение работы ваших спящих потоков или установить daemon = true при их создании.