这个问题的背景是我发现项目中大量使用了 ExecutorService pool = Executors.newSingleThreadExecutor() 作为局部变量使用 而 JDK 8 中的 SingleThreadExecutor 是用 new FinalizableDelegatedExecutorService 包了一层,实现了 finalize 方法会调用线程池的 shutdown() 方法。 我觉得比较疑惑的是,方法调用完之后,ThreadPoolExecutor 中的 workers 仍然有着对核心线程的引用,为什么局部变量 pool 为什么会被回收。