tomcat 是否在关闭之前等待应用程序线程完成



当我们使用脚本关闭 tomcat 时 shutdown.sh 它会等待应用程序线程完成还是杀死它们并关闭 tomcat?

Tomcat 尝试终止应用程序线程,但如果失败,则日志中可能会出现如下所示的错误消息:

SEVERE:Web 应用程序似乎已启动线程 命名[例如。ThreadExecutor_123],但未能阻止它。这是 很可能会造成内存泄漏。

之后,Tomcat 关闭并让应用程序仍在运行。为了避免这种情况,您的线程应该实现ServletContextListener并且在 Tomcat 关闭期间,您可以在contextDestroyed方法中安全地停止线程。您可以在此处阅读有关ServletContextListener链接的更多信息。

只要您的线程与 IO 无关,您就可以将其设置为守护程序以避免此问题。

Tomcat 不会停止任何它没有启动的线程。

因此,Tomcat

将关闭自己的线程池,但是如果您的应用程序启动了线程,则这些线程池将在 Tomcat 自行关闭后继续执行。

如果这些线程是"守护程序"线程,那么当main线程(如果您使用的是标准启动模式 - 无嵌入等,则为启动 Tomcat 的线程(停止时,JVM 将停止它们。

您应该始终安排让应用程序关闭自己的线程。正如@MichealDz所建议的,最好的方法是使用 ServletContextListener .

最新更新