Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序停止或服务器关闭时关闭线程池_Java_Multithreading_Tomcat7_Threadpool - Fatal编程技术网

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

Java 应用程序停止或服务器关闭时关闭线程池,java,multithreading,tomcat7,threadpool,Java,Multithreading,Tomcat7,Threadpool,我的应用程序中有一个线程池,我只想在应用程序停止时关闭它。我试过三种方法: 1.在以下情况下关闭: @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("CALLING CONTEXT DESTROYED."); PersistSigningExecutor.getService().shutdown(); } 2.以任何servlet的销毁方式关闭: @Ove

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

1.在以下情况下关闭:

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("CALLING CONTEXT DESTROYED.");
    PersistSigningExecutor.getService().shutdown();
}
2.以任何servlet的销毁方式关闭:

@Override
public void destroy() {   
    super.destroy();
    System.out.println("SHUTTING DOWN THREAD-POOLS");  
    PersistSigningExecutor.getService().shutdown();
}  
3.在ContextInitialized中添加关机挂钩

@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.
这意味着线程仍然没有关闭。当服务器关闭或应用程序未部署时,如何正确关闭此线程池?

使线程demon设置为布尔值,以便在jvm开始关闭时它将停止。demon线程基本上不会阻止jvm关闭

或者,如果您计划使用ExecutorService,则需要调用shutdown或shutdownNow


如果需要更多帮助,请告诉我。

Thread pool=ExecutorService?如果OP需要线程来结束当前正在运行的任务,请参阅此操作失败。守护进程线程的停止方式与Thread.stop相同。因此,如果有任何必要的协调来“关闭”,这将失败。