首页 > 解决方案 > 在不同线程中使用相同的 ExecutorService 实例是线程安全的吗?

问题描述

例如,我通过ExecutorService 实例执行可运行块,并且该可运行块通过相同的 ExecutorService 实例执行一些异步代码。所以我的代码看起来像:

final ExecutorService eService = Executors.newFixedThreadPool(nThreads);
    eService.execute(new Runnable() {
        public void run() {
            eService.execute(new Runnable() {
                public void run() {
                    System.out.println("Successfully created");
                }
            });
        }
    });
  1. 这段代码线程安全吗,因为 ExecutorService 没有状态?

在我的真实应用程序中,我有一些线程在它们内部创建了新线程,我想使用一个具有可配置线程池大小的 ExecutorService 实例(可能是一种不好的做法?)。

  1. 为不同的线程拥有一个 ExecutorService 实例是一种不好的做法吗?
  2. 如果是的话,也许有一些替代方案?

标签: javamultithreadingconcurrencyexecutorservicejava.util.concurrent

解决方案


看起来不错。重用线程而不是产生新线程(这很昂贵)是一种很好的做法,并且这种线程共享的一种可能实现可以是使用ExecutorService

请记住,它适用于您提到的代码,如果您尝试等待预定操作的结果,它可能会中断。当所有线程(来自池)将等待等待空闲线程(在该池中)执行它的操作结果时,这可能导致明显的死锁。


推荐阅读