#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 при их создании.