Каков наилучший способ управления созданием потока в Java на данном компьютере? - PullRequest
1 голос
/ 22 февраля 2020

В моем приложении я хочу создавать темы на основе ввода пользователя. Например, если пользователь предоставляет 10, я просто создаю пул из 10 потоков для выполнения какой-либо операции. Нет контроля над вводом пользователя. Я не хочу создавать 10k потоков, если пользователь вводит 10k в качестве входных данных. Это будет излишним для машины. Любые рекомендации?

Как контролировать количество пулов потоков?
Как рассчитать максимальное количество потоков, которое я могу создать на данном компьютере?

1 Ответ

0 голосов
/ 22 февраля 2020

Есть ли какие-либо рекомендации?

Этого нелегко достичь, не выполняя профилирование приложения в производственной среде и не получая реальных результатов. статистика, которая поможет вам определить оптимальные условия, при которых достигается максимальное использование процессора (см. закон Амдала ).

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

Составление сводки из 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.

...