Каков оптимальный размер пула потоков для простой программы, выполняющей задачи на базе процессора в 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), в среднем оптимально.