线程是否应该具有特殊的设计,以便Tomcat优雅地关闭?

2022-09-04 08:22:27

我开发了一个在Tomcat中运行的多线程Web应用程序。但我不能使用

shutdown.bat

雄猫没有优雅地停下来。在调试器中,我看到线程在关闭命令后继续运行。我是否必须修复应用程序代码才能满足特殊要求?谢谢。


答案 1

...并将其他响应与Java Servlet环境的工作原理联系起来;

如果不将线程声明为守护进程线程,则向线程发出服务器关闭信号的方法是实现 a 并将其配置到 Web 应用程序 (web.xml)。当Tomcat关闭时,它将首先关闭每个应用程序,这反过来将导致调用侦听器的方法 - 这是您可以向自己的线程发出信号,表明它们应该完成其工作。ServletContextListenercontextDestroyed()


答案 2

任何仍在运行的线程都将使 Java (Tomcat) 进程保持活动状态。确保所有线程都退出。一旦您的线程退出,Tomcat将能够关闭。

请参阅线程的 javadoc。请注意以下几点:

Java 虚拟机将继续执行线程,直到发生以下任一情况:

  • 已调用类运行时的 exit 方法,并且安全管理器已允许执行退出操作。
  • 所有不是守护程序线程的线程都已死亡,无论是通过从对 run 方法的调用返回,还是通过引发传播到 run 方法之外的异常。