退出时如何杀死库创建的非守护程序线程?

时间:2013-12-19 18:14:20

标签: java tomcat

我的应用程序在tomcat中运行,每次我停止tomcat它都会警告我有很多线程无法关闭。这些线程是由我的应用程序使用的库创建的,我不知道如何杀死它们。这个问题导致tomcat进程仍然存在,我调用了tomcat附带的bin / shutdown.sh。

任何人都可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:5)

这些库还应该公开您需要调用的相应“关闭”,“停止”等方法。查看各自的文件或来源。

您还可以使用jConsole或VisualVM查看尝试关闭计算机后仍处于活动状态的线程。如果你很幸运,你的图书馆会智能地命名它们(例如,RMQ不会默认),你可以告诉你剩下的是什么。

答案 1 :(得分:1)

您可以使用实现ServletContextListener的类并使用@WebListener()进行注释(或者在早期版本的Tomcat中指示它是web.xml中的侦听器)。

接口有两个方法contextInitializedcontextDestroyed,您可以在实现中对可能产生线程或需要特殊管理的任何库或类进行初始化和清理。像Tomcat这样的Java Servlet容器将调用这两个方法作为webapps启动/停止生命周期的一部分。例如:

@WebListener()
public class RestartListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //some initialization code here
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        MemcachedManager.shutdown();
    }
}