Java 应用程序停止或服务器关闭时关闭线程池
我的应用程序中有一个线程池,我只想在应用程序停止时关闭它。我试过三种方法: 1.在以下情况下关闭: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
@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相同。因此,如果有任何必要的协调来“关闭”,这将失败。