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