Каков оптимальный размер пула потоков для простой программы, выполняющей задачи на базе процессора в Java

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

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

Предполагая случай простой программы, которая передает все свои задачи этому исполнителю и мало что делает, я предполагаю, что наличие пула потоков большего размера приведет к замедлению работы, потому что ОС будет вынуждена чаще выбирать временные срезы, чтобы дать каждому потоку в пуле потоков возможность запустить.

Это правильно, и если это так, то это реальная проблема или в основном теоретическая, то есть, если бы я увеличил размер пула потоков до 1000, я бы заметил огромную разницу.

2 ответа

Решение

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

Я бы использовал кратное (например, 1 или 2) число процессоров, а не добавлял только один, так как наличие слишком большого количества потоков может иметь неожиданные накладные расходы.

Для справки, проверьте это описание.

http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

Короче говоря, то, что у вас есть (№ CPU + 1), в среднем оптимально.

Другие вопросы по тегам