7

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

4

4 回答 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 回答