当我们使用脚本关闭 tomcat 时 shutdown.sh 它会等待应用程序线程完成还是杀死它们并关闭 tomcat?
Tomcat 尝试终止应用程序线程,但如果失败,则日志中可能会出现如下所示的错误消息:
SEVERE:Web 应用程序似乎已启动线程 命名[例如。ThreadExecutor_123],但未能阻止它。这是 很可能会造成内存泄漏。
之后,Tomcat 关闭并让应用程序仍在运行。为了避免这种情况,您的线程应该实现ServletContextListener
并且在 Tomcat 关闭期间,您可以在contextDestroyed
方法中安全地停止线程。您可以在此处阅读有关ServletContextListener
链接的更多信息。
只要您的线程与 IO 无关,您就可以将其设置为守护程序以避免此问题。
Tomcat 不会停止任何它没有启动的线程。
因此,Tomcat将关闭自己的线程池,但是如果您的应用程序启动了线程,则这些线程池将在 Tomcat 自行关闭后继续执行。
如果这些线程是"守护程序"线程,那么当main
线程(如果您使用的是标准启动模式 - 无嵌入等,则为启动 Tomcat 的线程(停止时,JVM 将停止它们。
您应该始终安排让应用程序关闭自己的线程。正如@MichealDz所建议的,最好的方法是使用 ServletContextListener
.