【问题标题】:Shutdown Thread Pool when application stops or server shutsdown应用程序停止或服务器关闭时关闭线程池
【发布时间】:2023-03-02 21:32:01
【问题描述】:

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

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.

这意味着线程仍然没有关闭。当服务器关闭或应用程序未部署时,如何正确关闭该线程池?

【问题讨论】:

标签: java multithreading tomcat7 threadpool


【解决方案1】:

使线程恶魔(setDamon(boolean)),这样当jvm开始关闭时它就会停止,基本上恶魔线程不会阻止JVM关闭。

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

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

【讨论】:

  • 如果 OP 需要线程来结束当前正在运行的任务,这将失败。 daemon 线程以与 Thread.stop 相同的方式停止。因此,如果需要协调“关闭”,这将失败。
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多