应用程序停止或服务器关闭时关闭线程池

时间:2015-03-18 11:34:48

标签: java multithreading tomcat7 threadpool

我的应用程序中有一个线程池,我想在应用程序停止时关闭它。我试过三种方法:

1.在上下文中被摧毁:

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("CALLING CONTEXT DESTROYED.");
    PersistSigningExecutor.getService().shutdown();
}

2.关注任何servlet的destroy方法:

@Override
public void destroy() {   
    super.destroy();
    System.out.println("SHUTTING DOWN THREAD-POOLS");  
    PersistSigningExecutor.getService().shutdown();
}  

3.在contextInitialised中添加关闭钩子

@Override
public void contextInitialized(ServletContextEvent sce) {       
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                try {
                    System.out.println("SHUTTING DOWN THREAD-POOLS");                        
                    PersistSigningExecutor.getService().shutdown();

            }
        });

}

但他们都没有工作。我没有看到任何印刷声明。而且最后我得到日志说:

SEVERE: The web application [/app] appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.

表示线程仍未关闭。如何在关闭服务器或取消部署应用程序时正确关闭此线程池?

1 个答案:

答案 0 :(得分:0)

制作线程恶魔(setDamon(boolean)),以便在jvm开始关闭时停止,基本上恶魔线程不会阻止JVM关闭。

否则,如果您打算使用ExecutorService,则需要致电shutdown()shutdownNow()

如果您需要更多帮助,请与我联系。