我开发了一个在Tomcat中运行的多线程Web应用程序。 但我不能用
shutdown.bat
Tomcat并没有优雅地停止。在调试器中,我看到线程在shutdown命令后继续运行。我是否必须修复我的应用程序代码以满足特殊要求? 感谢。
答案 0 :(得分:12)
...并将其他响应与Java Servlet环境的工作联系起来;
如果您没有将线程声明为守护程序线程,则表示服务器关闭线程的方式是实现ServletContextListener
并将其配置到Web应用程序(web.xml)。当Tomcat关闭时,它将首先关闭每个应用程序,这反过来将导致调用侦听器的contextDestroyed()
方法 - 这是你可以通知自己的线程他们应该完成他们的工作。< / p>
答案 1 :(得分:6)
任何仍在运行的线程都会使Java(Tomcat)进程保持活动状态。确保所有线程都退出。一旦你的线程退出,Tomcat就可以关闭了。
请参阅Thread的javadoc。请注意以下事项:
Java虚拟机继续执行线程,直到发生以下任一情况:
- 已调用类Runtime的exit方法,安全管理器已允许退出操作。
- 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常。
答案 2 :(得分:5)
你需要取消你的线程,最好是通过调用它们并确保它们以这样的方式编写,即它们响应中断 - 意思是,检查它们的中断标志并智能地响应InterruptedExceptions(不只是吃它们并继续)。
上述建议假设您不希望您的线程立即放弃他们正在做的事情。如果您对此感到满意,那就让它们成为守护进程。