Динамически изменять corePoolSize для ThreadPoolExecutor

Предположим, что на машине с 4 процессорами работает пул потоков, и я хочу выполнить динамическое управление нагрузкой для этого пула. Можно ли изменить corePoolSize, когда в пуле запущены какие-то потоки? То есть при низкой нагрузке допускается одновременное выполнение не более 2 потоков, а при высокой нагрузке допускается 4 потока. Если нет, то есть ли правильное решение?


person Xingjun Wang    schedule 27.07.2016    source источник
comment
Чаще всего размер ядра и максимальный размер пула устанавливаются только при построении, но они также могут быть изменены динамически с помощью setCorePoolSize(int) и setMaximumPoolSize(int). Из docs.oracle.com/javase/8 /docs/api/java/util/concurrent/   -  person Fildor    schedule 27.07.2016
comment
Как вы планируете определять высокую/низкую нагрузку?   -  person Fildor    schedule 27.07.2016
comment
Re, если нет, есть ли правильное решение? На худой конец ничто не мешает реализовать собственный пул потоков.   -  person Solomon Slow    schedule 27.07.2016
comment
Большое спасибо за ваш комментарий.   -  person Xingjun Wang    schedule 28.07.2016


Ответы (1)


Можно ли изменить corePoolSize, когда в пуле запущены какие-то потоки?

Безусловно. corePoolSize помечен как volatile в ThreadPoolExecutor, поэтому вы можете в любой момент вызвать tpe.setCorePoolSize(...) в зависимости от загрузки вашего компьютера. Вы даже можете создать задание в своем пуле, чтобы заснуть, проверить нагрузку и настроить размер основного пула. Вы, конечно, захотите добавить еще один поток к размеру ядра, чтобы сделать это.

То есть при низкой нагрузке допускается одновременное выполнение не более 2 потоков, а при высокой нагрузке допускается 4 потока.

Звучит неплохо, хотя важно отметить, что это имеет смысл только в том случае, если задания, которые вы отправляете в пул потоков, полностью привязаны к процессору. Любой ввод-вывод (диск, сеть и т. д.) означал бы, что сокращение параллелизма не имеет особого смысла.

Тем не менее, я никогда не чувствовал, что должен это делать, хотя я написал массу многопоточных приложений.

person Gray    schedule 27.07.2016