我有一组要处理的记录,并且可以并行处理,所以我创建了一个ExecutorService(通过Executors#newCachedThreadPool())。单个记录的处理本身是由可并行化的步骤组成的,所以我想使用另一个ExecutorService
. 有没有一种简单的方法可以让这个新线程使用相同的底层线程池?它甚至是可取的吗?谢谢。
Hank Gay
问问题
4321 次
4 回答
7
回答你的问题:不,两个ExecutorService
对象不能共享一个线程池。但是,您可以在您的对象之间共享一个ExecutorService
,或者根据需要创建多个执行器,尽管不太推荐这样做。
Executor
最佳解决方案:在您的对象之间共享。
于 2008-12-15T15:25:09.213 回答
6
简短的回答:没有。
更长的答案:您将需要自己的实现来做到这一点。ExecutorService
是一个接口,AbstractExecutorService
很容易实现。如果您想要两个ExecutorService
共享相同的线程池(例如具有不同的最大活动线程值),您可以使用代理模式来进行线程池共享ExecutorService
。
于 2008-12-15T15:56:41.317 回答
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);
}
}
于 2008-12-15T15:17:56.857 回答
1
有几个很好的理由想要这样做,例如每个队列的单独边界和指标。AFAIK,Cassandra 2.1 从使用共享线程池的执行器服务实现中获得了不小的好处;代码位于https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java。
于 2014-12-18T16:58:52.553 回答