我想知道为什么ThreadPoolExecutor的finalize()方法在已知finalize方法只有在所有线程都停止后才会被GC调用时,还要调用其shutdown()方法。那么ThreadPoolExecutor为什么要重写finalize()呢?
对我来说(以及我的项目中线程泄漏的来源),ThreadPoolExecutor.finalize()调用shutdown()似乎是具有误导性的,因为这给人一种强烈(但错误)的印象: - ThreadPoolExecutor管理其线程的生命周期,并在GC收集ThreadPoolExecutor对象时停止线程 - 只有在想获得确定性结果而不是依赖于GC来清理时才需要调用shutdown()或shutdownNow()(显然,这是不好的做法!)
注: 在这个线程中,why-doesnt-this-thread-pool-get-garbage-collected Affe解释了为什么客户端仍然需要调用shutdown()。
在这个帖子中,为什么ThreadPoolexecutor.finalize()调用shutdown而不是shutdownNow,楼主对此话题感到困惑,但答案并不像1那样全面。
对我来说(以及我的项目中线程泄漏的来源),ThreadPoolExecutor.finalize()调用shutdown()似乎是具有误导性的,因为这给人一种强烈(但错误)的印象: - ThreadPoolExecutor管理其线程的生命周期,并在GC收集ThreadPoolExecutor对象时停止线程 - 只有在想获得确定性结果而不是依赖于GC来清理时才需要调用shutdown()或shutdownNow()(显然,这是不好的做法!)
注: 在这个线程中,why-doesnt-this-thread-pool-get-garbage-collected Affe解释了为什么客户端仍然需要调用shutdown()。
在这个帖子中,为什么ThreadPoolexecutor.finalize()调用shutdown而不是shutdownNow,楼主对此话题感到困惑,但答案并不像1那样全面。
ThreadPoolExecutor.finalize()
的JavaDocs确实包含了“它没有线程”的字眼,但这很容易被忽视。
finalize()
的文档有点令人困惑......我想知道一个.newFixedThreadPool()
怎么可能是"没有线程"。 - fge