【发布时间】:2014-04-28 19:02:38
【问题描述】:
我想知道为什么 ThreadPoolExecutor finalize() 方法在知道 finalize 方法只被 GCAFTER 调用它的所有线程时调用它的 shutdown() 方法停了下来。那么为什么 ThreadPoolExecutor 会覆盖 finalize() 呢?
ThreadPoolExecutor.finalize() 调用 shutdown() 对我(以及我的项目的线程泄漏的来源)似乎具有误导性,因为这给人一种强烈(但错误)的印象,即
- ThreadPoolExecutor 管理其线程的生命周期,并在 GC 收集到 ThreadPoolExecutor 对象时停止线程
- 如果你想要确定的结果而不是依赖 GC 来整理,则只需要调用 shutdown() 或 shutdownNow() (显然,这样做是不好的做法!)
注意事项
在这个线程中,why-doesnt-this-thread-pool-get-garbage-collectedAffe 解释了为什么客户端仍然需要调用shutdown()
在这个帖子里,why-threadpoolexecutor-finalize-invokes-shutdown-and-not-shutdownnow发起人对这个话题感到困惑,但答案并不像1那么全面
ThreadPoolEecutor.finalize() 的 JavaDocs 确实包含“并且它没有线程”的字样,但这很容易被忽略。
【问题讨论】:
-
我在这里同意
finalize()的文档相当混乱......我想知道.newFixedThreadPool()怎么会有“无线程”。 -
ThreadPoolExecutor 的 JavaDocs 有一个 Finalization 部分解释了“如果您想确保即使用户忘记调用 shutdown() 也能回收未引用的池,那么您必须安排未使用的线程最终死亡,通过设置适当的保持活动时间,使用零核心线程的下限和/或设置 allowCoreThreadTimeOut(boolean)。"。因此,线程数有可能减少并达到零。
标签: java multithreading garbage-collection threadpoolexecutor