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

时间:2016-03-14 19:24:47

标签: java multithreading tomcat threadpool executorservice

我通过创建固定数量的线程来执行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停止时,我们收到此错误:

  

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

这是一个真正的问题吗?如果没有这些服务错误,我该怎么做才能正常停止tomcat。

1 个答案:

答案 0 :(得分:5)

这是一个真正的问题。执行者汇集的非守护程序线程不会自行消失,如果您没有在执行程序上调用shutdown,则线程将保持活动状态并阻止JVM退出。

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

或者,您可以使ThreadFactory守护程序线程返回线程,以便在最后一个非守护程序线程终止时它们将退出。由于您正在进行数据检索,因此最好避免这种情况,因为它可能会使数据库资源不受限制。