Динамический пул потоков
У меня длительный процесс, который слушает события и выполняет интенсивную обработку.
В настоящее время я использую 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, определенному ранее, задача будет отклонена.
Так что установите значения maxPoolSize
а также corePoolSize
должным образом.