我有一组要处理的记录,处理可以并行化,所以我创建了一个ExecutorService(通过Executors#newCachedThreadPool())。单个记录的处理本身由可并行化的步骤组成,因此我想使用另一个ExecutorService
。是否有一种简单的方法可以使这个新的使用相同的底层线程池?它甚至是可取的吗?感谢。
答案 0 :(得分:7)
要回答您的问题:否,两个ExecutorService
个对象无法共享一个线程池。但是,您可以在对象之间共享ExecutorService
,或者根据需要创建多个执行程序,但不建议这样做。
最佳解决方案:在您的对象之间共享Executor
。
答案 1 :(得分:6)
简短回答:不。
更长的答案:你需要自己的实现才能做到这一点。 ExecutorService
是一个界面,AbstractExecutorService
非常容易实现。
如果您希望两个ExecutorService
共享相同的ThreadPool(例如,具有不同的最大活动线程值),您可以使用代理模式使ThreadPool共享ExecutorService
。
答案 2 :(得分:2)
您是否可以将对现有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);
}
}
答案 3 :(得分:0)
有一些很好的理由想要这样做,例如每个队列的单独边界和指标。 AFAIK,Cassandra 2.1从使用带有共享线程池的执行器服务实现中获得的收益并非微不足道;代码位于https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java。