这个问题的背景是我发现项目中大量使用了 ExecutorService pool = Executors.newSingleThreadExecutor()
作为局部变量使用
而 JDK 8 中的 SingleThreadExecutor
是用 new FinalizableDelegatedExecutorService
包了一层,实现了 finalize
方法会调用线程池的 shutdown()
方法。
我觉得比较疑惑的是,方法调用完之后,ThreadPoolExecutor
中的 workers
仍然有着对核心线程的引用,为什么局部变量 pool
为什么会被回收。
1
karottc 2023-03-28 16:27:41 +08:00
finalize 执行时机不确定把,你手动 shutdown 试试
|
2
lry OP @karottc 我感到奇怪的是为什么 pool 有着一个 waiting 状态的核心线程的引用,还会被 gc 回收走到 finalize 方法里
|
3
choice4 2023-03-28 19:26:40 +08:00 1
大概因为是局部变量。
困惑的点应该是有一个理解误区,就是线程池中的线程其实不对 ExecutorService 实例产生引用。 在 ExecutorService 局部变量生命周期结束后也就不存在外部对它的引用,这个对象可以被回收,进而停掉线程池,然后等待线程执行正常结束。 |