如何在 Tomcat 停止时停止执行程序线程



我正在通过创建固定数量的线程来执行HTTP GET数据检索来使用执行器服务。

executorService = ExecutorServiceFactory.getInstance().getExecutorService(Config.getInstance().getNumberOfThreads(), "ThreadExecutor_"+UIDFactory.getInstance().createSessionID());
executorService.execute(new Retrieve(data));
private class Retrieve implements Runnable{
    private Vector<String> data;
    public WADORetrieve(Vector<String> data) {          
            this.data = data;
    }
    @Override
    public void run() {
        for(int i=0;i<data.length;i++){
            fetch(data[i]);
        }
    }
}    

当Tomcat停止时,我们收到此错误:

SEVERE:Web 应用程序 [/viewer] 似乎启动了一个名为 [ThreadExecutor_5161616156] 的线程,但未能停止它。这很可能会造成内存泄漏。

这是一个真正的问题吗?我可以做些什么来正确停止tomcat而不会出现这些服务错误。

这是一个

真正的问题。由执行程序池化的非守护进程线程不会自行消失,如果您不在执行器上调用 shutdown,则线程将保持活动状态并阻止 JVM 退出。

创建一个 ServletContextListener,在 contextDestroyed 上调用执行器上的关闭。

或者,您可以使线程工厂守护程序线程返回的线程,以便在最后一个非守护程序线程终止时退出。由于您正在执行数据检索,因此最好避免这种情况,因为它可能会使数据库资源未关闭。

相关内容

  • 没有找到相关文章

最新更新