Предположим, что на машине с 4 процессорами работает пул потоков, и я хочу выполнить динамическое управление нагрузкой для этого пула. Можно ли изменить corePoolSize, когда в пуле запущены какие-то потоки? То есть при низкой нагрузке допускается одновременное выполнение не более 2 потоков, а при высокой нагрузке допускается 4 потока. Если нет, то есть ли правильное решение?
Динамически изменять corePoolSize для ThreadPoolExecutor
Ответы (1)
Можно ли изменить corePoolSize, когда в пуле запущены какие-то потоки?
Безусловно. corePoolSize
помечен как volatile
в ThreadPoolExecutor
, поэтому вы можете в любой момент вызвать tpe.setCorePoolSize(...)
в зависимости от загрузки вашего компьютера. Вы даже можете создать задание в своем пуле, чтобы заснуть, проверить нагрузку и настроить размер основного пула. Вы, конечно, захотите добавить еще один поток к размеру ядра, чтобы сделать это.
То есть при низкой нагрузке допускается одновременное выполнение не более 2 потоков, а при высокой нагрузке допускается 4 потока.
Звучит неплохо, хотя важно отметить, что это имеет смысл только в том случае, если задания, которые вы отправляете в пул потоков, полностью привязаны к процессору. Любой ввод-вывод (диск, сеть и т. д.) означал бы, что сокращение параллелизма не имеет особого смысла.
Тем не менее, я никогда не чувствовал, что должен это делать, хотя я написал массу многопоточных приложений.