线程是否有特殊设计要由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(不仅仅是吃掉它们并继续)。

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