如何在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守护程序线程返回线程,以便在最后一个非守护程序线程终止时它们将退出。 由于您正在进行数据检索,因此最好避免这种情况,因为它可能会使数据库资源不受限制。
- 将代码从使用定时器移植到scheduledexecutorservice
- 如何在java中设置Socket写入时间?
- Java ServiceExecutor终止条件
- Java从ExecutorService设置回调
- 在webapp中正常关闭ExecutorService?
- Java:带有Callables的ExecutorService:invokeAll()和future.get() – 结果是否正确?
- 在ThreadPoolExecutor中使用InheritableThreadLocal – 或者 – 不重用线程的ThreadPoolExecutor
- 优化许多文件的并行处理
- 无法停止使用ExecutorService启动的任务