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