Могут ли два ExecutorServices совместно использовать пул потоков?
-
21-08-2019 - |
Вопрос
У меня есть набор записей, которые нужно обработать, и обработку можно распараллелить, поэтому я создал ИсполнительСервис (с помощью Исполнители#newCachedThreadPool()).Обработка отдельной записи сама по себе состоит из распараллеливаемых шагов, поэтому я хотел бы использовать другой ExecutorService
.Есть ли простой способ заставить этот новый использовать тот же базовый пул потоков?Это вообще желательно?Спасибо.
Решение
Чтобы ответить на ваш вопрос: нет, два ExecutorService
объекты не могу поделиться пулом потоков.Однако вы можете поделиться ExecutorService
между вашими объектами или, в качестве альтернативы, при необходимости создайте несколько Исполнителей, хотя это менее рекомендуется.
Лучшее решение:поделитесь 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.