如何在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 data; public WADORetrieve(Vector 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。

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

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

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