是否有两个ExecutorServices可以共享一个线程池?

我有一组要处理的记录,并且处理可以并行化,所以我创建了一个ExecutorService (通过Executors#newCachedThreadPool() )。 单个记录的处理本身由可并行化的步骤组成,因此我想使用另一个ExecutorService 。 是否有一种简单的方法可以使这个新的使用相同的底层线程池? 它甚至可取吗? 谢谢。

回答你的问题: ,两个ExecutorService对象不能共享一个线程池。 但是,您可以在对象之间共享ExecutorService ,或者根据需要创建多个Executor,但不建议这样做。

最佳解决方案:在对象之间共享Executor

简答:没有。

更长的答案:你需要自己的实现来做到这一点。 ExecutorService是一个接口, AbstractExecutorService非常容易实现。 如果您希望两个ExecutorService共享相同的ThreadPool(例如,具有不同的最大活动线程值),您可以使用代理模式使ThreadPool共享ExecutorService

您是否可以将对现有ExecutorService的引用传递给工作对象?

 public class Task implements Runnable { private final ExecutorService threadPool; private final SubTask[] subtasks; public Task(ExecutorService threadPool) { this.threadPool = threadPool; this.subtasks = createSubtasksIGuess(); } public void run() { for(SubTask sub : subtasks) threadPool.submit(sub); } } 

有一些很好的理由想要这样做,例如每个队列的单独边界和指标。 AFAIK,Cassandra 2.1在使用带有共享线程池的执行器服务实现时获得的收益并非微不足道; 代码位于https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java 。