Возможно ли для двух ExecutorServices совместно использовать пул потоков? - PullRequest
6 голосов
/ 15 декабря 2008

У меня есть коллекция записей для обработки, и обработка может быть распараллелена, поэтому я создал ExecutorService (через Executors # newCachedThreadPool () ). Обработка отдельной записи сама по себе состоит из распараллеливаемых шагов, поэтому я бы хотел использовать еще один ExecutorService. Есть ли простой способ заставить этот новый использовать тот же базовый пул потоков? Это даже желательно? Спасибо.

Ответы [ 4 ]

7 голосов
/ 15 декабря 2008

Чтобы ответить на ваш вопрос: нет , два ExecutorService объекта не могут совместно использовать пул потоков. Однако вы можете разделить ExecutorService между вашими объектами или, при необходимости, создать несколько исполнителей, хотя это менее рекомендуется.

Лучшее решение: разделите Executor между вашими объектами.

6 голосов
/ 15 декабря 2008

Краткий ответ: Нет.

Более длинный ответ: для этого вам потребуется собственная реализация. ExecutorService - это интерфейс, а AbstractExecutorService довольно прост в реализации. Если вы хотите, чтобы два ExecutorService совместно использовали один и тот же ThreadPool (например, с другим максимальным значением активного потока), вы можете использовать шаблон прокси, чтобы сделать общий доступ к ThreadPool ExecutorService.

2 голосов
/ 15 декабря 2008

Можете ли вы просто передать ссылку на существующий 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);
    }
}
0 голосов
/ 18 декабря 2014

Есть несколько веских причин для этого, например, отдельные границы и метрики для очереди. AFAIK, Cassandra 2.1 получил немаловажное преимущество от использования реализации службы исполнителя с общим пулом потоков; код на https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java.

...