Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?

Posted

技术标签:

【中文标题】Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?【英文标题】:What happens to the Executor FixedThreadPool after execution, as executor does not have a shutdown method?Executor FixedThreadPool 执行后会发生什么,因为 executor 没有关闭方法? 【发布时间】:2021-07-30 00:05:22 【问题描述】:

如果我像这样实例化一个 Executor:

private final Executor executor = Executors.newFixedThreadPool(2);

然后执行如下代码:

executor.execute(() -> 
                    doSomeThingHere();
                );

线程池在代码执行后被销毁会发生什么? Executor 没有任何关闭方法?每次我运行应用程序的过程时,我都会在我的应用程序中体验到线程的建立。这可能不是原因,但我想了解这一点并排除它。目前每次我想在后台运行代码时,我都会以这种方式实例化一个新的执行器。

【问题讨论】:

“现在每次我想在后台运行代码时,我都会以这种方式实例化一个新的执行程序”,这很可能是问题所在。只创建一个 不要分配给Executor 字段。使用ExecutorService,它确实有一个shutdown 方法。 @Eugene 好的,谢谢,所以我应该创建一个实例并在我的代码中使用它好的,我认为可能是这种情况。 @SotiriosDelimanolis 谢谢我当然可以这样做,并在执行我的任务后调用关机。现在我会这样做,看看它是否对我的问题有帮助,我仍然想知道 Executor 的线程池中的线程是否被杀死以及何时被杀死? 在固定的线程池中,没有。当执行器关闭时,它们将被停止。 【参考方案1】:

使用ExecutorService 而不是Executor,因为newFixedThreadPool() 返回一个ExecutorService 并且有一个shutdown 方法。


如果执行程序是使用创建守护线程的ThreadFactory 创建的(请参阅setDaemon),并且没有其他非守护线程在运行,例如主线程或 EDT,则虚拟机将被终止(停止所有线程)

【讨论】:

以上是关于Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java 并发一文读懂

FixedThreadPool使用demo

如何选择FixedThreadPool和CachedThreadPool

FixedThreadPool vs CachedThreadPool:两害相权取其轻

Java 线程池之FixedThreadPool(Java代码实战-003)

Dubbo中的线程池——自适应扩展点应用之一