2012-10-10 45 views
22

在我的webapp中,我创建了一个使用固定大小的ThreadPool的ExecutorService的服务。我在整个应用程序生命周期中重复使用相同的ExecutorService在webapp中优雅地关闭ExecutorService?

private static ExecutorService pool = Executors.newFixedThreadPool(8); 

所有在Tomcat的运行时书亭下降,这使我有以下错误:

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. 

我意识到我需要书亭的tomcat下来之前关闭ExecutorService的。索姆斯SO线程已经谈论这个,但我找不到一个干净的方式来处理这个问题。

我应该使用ShutdownHook建议@ Tim-bender在Graceful shutdown of threads and executor?还是应该使用CachedThreadPool来代替?

回答

25

关机钩是不是在Tomcat的一个好方法,因为:

  • 它将关闭游泳池太晚了(在关机),Tomcat将已经警告你没有关闭资源

  • 你居然想要在应用程序未部署时关闭该池,以便重新部署工作(否则每个应用程序将创建新池,并且它们将仅在完全关闭时关闭)

  • 关闭线程池可能需要一些时间(见下文),关闭挂钩应该是尽可能快

好多地方是ServletContextListener.contextDestroyed()。请记住,您必须同时存储池shutdownNow()(取消运行并拒绝新任务)和awaitTermination(),以等待已运行的任务完成并停止所有线程。

+1

正是我需要知道的 –

7

除了托马斯什么建议,你也可以使用未使用60秒CachedThreadPool

线程终止,并从缓存中删除。因此,对于长期保持足够的空闲池不会消耗任何资源

所以一个很好的解决办法是使用CachedThreadPool和关闭它在ServletContextListener.contextDestroyed()

+4

+1 congrats for 5K –

+0

@NandkumarTekale谢谢。看上去不错 :) –