线程是否有特殊设计才能被Tomcat优雅地关闭?

use*_*818 13 java multithreading tomcat

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

shutdown.bat
Run Code Online (Sandbox Code Playgroud)

Tomcat没有优雅地停下来.在调试器中,我看到线程在shutdown命令后继续运行.我是否必须修复我的应用程序代码以满足特殊要求?谢谢.

小智 12

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

如果您没有将线程声明为守护程序线程,则表示服务器关闭线程的方式是实现ServletContextListener并将其配置到Web应用程序(web.xml).当Tomcat关闭时,它将首先关闭每个应用程序,这反过来将导致contextDestroyed()调用侦听器的方法 - 这是你可以通知自己的线程他们应该完成他们的工作.


Jac*_*nds 6

任何仍在运行的线程都将使Java(Tomcat)进程保持活动状态.确保所有线程都退出.一旦你的线程退出,Tomcat就可以关闭了.

请参阅线程的javadoc .请注意以下事项:

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

  • 已调用类Runtime的exit方法,并且安全管理器已允许执行退出操作.
  • 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常.


Nat*_*hes 5

您需要取消线程,最好是通过调用interrupt它们并确保它们以这样的方式编写,即它们响应中断 - 意味着,检查它们的中断标志并智能地响应InterruptedExceptions(不仅仅是吃它们并继续) .

上述建议假设您不希望您的线程立即放弃他们正在做的事情.如果你对它好,那就让它们成为守护进程.

  • 我使用第三方库创建自己的线程的问题.而这些线程是有问题的. (3认同)