Есть ли какие-либо рекомендации?
Этого нелегко достичь, не выполняя профилирование приложения в производственной среде и не получая реальных результатов. статистика, которая поможет вам определить оптимальные условия, при которых достигается максимальное использование процессора (см. закон Амдала ).
Тем не менее, одно можно сказать наверняка, и вы уже это знаете: вам не следует создавать больше потоков, чем число, которое будет оптимальным для вашей рабочей среды.
Составление сводки из Java Практический параллелизм :
Элемент 8.2 Определение размеров пулы потоков
Идеальный размер пула потоков зависит от типов задач, которые будут отправлены, и характеристик системы развертывания. Размеры пула потоков редко должны быть жестко закодированы; вместо этого размеры пула должны предоставляться механизмом конфигурации или динамически вычисляться с помощью Runtime.availableProcessors
.
Например,
для задач с интенсивными вычислениями, N процессор -процессорная система обычно достигает оптимального использования с пулом потоков N процессор + 1 поток.
и учитывая
N процессор = количество процессоров
U процессор = целевое использование процессора, 0 ≤ U процессор ≤ 1
Вт / C = отношение времени ожидания к времени вычислений
Оптимальный размер пула для поддержания процессоров на требуемом уровне использования:
(и это должно ответ Как рассчитать максимальное количество потоков, которые я могу создать на данном компьютере? )
N потоков = N процессор ∗ U процессор ∗ (1 + W / C)
Вы можете определить количество доступных процессоров, используя
int numberOfCPU = Runtime.getRuntime().availableProcessors();
Как n Я управляю счетчиком пула потоков?
Вы можете (и должны) использовать любой из одновременных классов, добавленных к Java вместо создания и управления Thread
s самостоятельно. Например ThreadPoolExecutor
.