Могут ли два ExecutorServices совместно использовать пул потоков?

StackOverflow https://stackoverflow.com/questions/368613

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top