Ответ 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
.