Динамический пул потоков

У меня есть длительный процесс, который прослушивает события и делает интенсивную обработку.

В настоящее время я использую Executors.newFixedThreadPool(x) для дросселирования числа заданий, которые выполняются одновременно, но в зависимости от времени суток и других факторов, я хотел бы иметь возможность динамически увеличивать или уменьшать количество одновременных потоков.

Если я уменьшу количество параллельных потоков, я хочу, чтобы текущие текущие задания заканчивались красиво.

Есть ли библиотека Java, которая позволяет мне контролировать и динамически увеличивать или уменьшать количество параллельных потоков, запущенных в пуле потоков? (Класс должен реализовать ExecutorService).

Должен ли я сам реализовать его?

Ответы

Ответ 1

Посмотрите ниже API в ThreadPoolExecutor

public void setCorePoolSize(int corePoolSize)

Устанавливает базовое число потоков. Это переопределяет любое значение, заданное в конструкторе.

Если новое значение меньше текущего значения, избыточные существующие потоки будут прекращены, когда они станут свободными.

Если больше, новые потоки при необходимости будут запущены для выполнения любых задач в очереди.

Инициализация:

ExecutorService service = Executors.newFixedThreadPool(5); 

На основе необходимости измените размер пула потоков, используя ниже API

((ThreadPoolExecutor)service).setCorePoolSize(newLimit);//newLimit is new size of the pool 

Важное примечание:

Если очередь заполнена, а новое значение количества потоков больше или равно maxPoolSize, определенное ранее, Task будет отклонен.

Значит правильно заданные значения maxPoolSize и corePoolSize.