我需要关注ThreadPoolExecutor的关闭吗?

3

我有一个REST应用程序(技术栈:Java8/Tomcat7/Spring4.2/Jersey2.15),在我的REST端点中使用了线程池(ThreadPoolExecutor)。

      private ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

终端点类通过spring注释@ Component进行配置(因此默认为单例)。
在ThreadPoolExecutor的javadoc中,我读到这个:
最终处理 不再在程序中引用且没有剩余线程的池将自动关闭。如果要确保即使用户忘记调用shutdown()也可以回收未引用的池,则必须安排未使用的线程最终死亡,通过设置适当的保持活动时间、使用零核心线程的下限或设置allowCoreThreadTimeOut(boolean)。
所以当我不调用threadPool.shutdown()时,池会在应用程序结束时关闭(通常在这种情况下,当tomcat关闭或应用程序停止时)。
我的问题是:我需要关心池的关闭吗?会发生副作用吗?(例如mem泄漏、长时间的Tomcat关闭时间等)还是它非常稳定?
1个回答

4
通常情况下,优雅地关闭线程池是一个好的实践。如果存在未完成的任务,关闭tomcat实例可能需要更长的时间,但奖励是更受控和安全的应用程序,并且可能会在未完成的任务出现问题时节省您的故障排除时间。
由于您已经在使用Spring,您可能想要查看使用ThreadPoolTaskExecutor的托管Spring线程池。

1
正如我所想,我应该为线程池添加关闭功能。Spring的ThreadPoolTaskExecutor是这个遗留应用程序未来重构的一个考虑因素。目前有太多的线程池位置,所以我想分步骤进行更改。 - Erik
那是一个真正的挑战!祝你一切顺利! - gkatzioura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接