Что касается создания потоков или пула потоков для 100 задач

Я создаю приложение монитора, которое может контролировать 100-150 устройств... Теперь для разработки приложения для монитора у меня есть два подхода: -

  • Создайте поток для каждого из устройств для мониторинга, и каждый поток будет пинговать (используя ICMP) на устройстве, чтобы узнать, находится ли устройство в сети или нет. Эти потоки будут работать неопределенно, чтобы узнать свой статус после определенного временного интервала (скажем, 60 секунд).

  • Создайте пул потоков и для каждого устройства отправьте задачу в пул потоков. Задача проста пинговать на устройство. Таким образом, в текущем проекте задачи будут больше, чем потоки в пуле потоков. Например, скажем, есть 100 устройств для мониторинга, будет проверено 100 задач, и пул потоков скажет 40 потоков для выполнения этих 100 задач. Конечно, продолжительность времени для запуска следующей задачи будет таковой, чтобы завершить все ожидающие задачи в пуле потоков.

Какой подход будет лучше?

Ответы

Ответ 1

Я бы создал ScheduledExecutorService (например, через Executors.newScheduledThreadPool), что позволяет планировать повторные пинги. Знаете ли вы, сколько времени может пройти каждый пинг? Я надеюсь, что вы сможете уйти с очень небольшим количеством потоков - намного меньше 40, если вам нужно только пинговать каждый из 100 устройств один раз в минуту.

Вы можете запустить его с достаточно небольшим количеством потоков, но помните о том, что информация, добавленная Марксом в комментарии, не используется (как я и ожидал); это эффективно фиксированный пул потоков. Тем не менее, вы должны иметь возможность делать меньше 40...

Ответ 2

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

Создание threadpool было бы желательным решением. Вы можете настроить размер потока в соответствии с требованиями и доступностью ресурсов. Если вам необходимо периодически проверять устройства на постоянной основе после определенного интервала времени, вы можете обратиться за плановой службой-исполнителем, которая внутренне заботится о планировании задач периодически. Но да, использование threadpool - это поучительный выбор.

Ответ 3

Вы должны учитывать тайм-аут ping при расчете максимального количества потоков. Сколько потоков требует pinging 100 устройств, учитывая тайм-аут ping 5 секунд и период повторения 60 секунд?

Через 60 секунд каждая нить может выполнять 12 попыток устройства (60 секунд разрешают 12 пинг до таймаута через 5 секунд). Это означает, что вам нужно как минимум 9 нитей, каждая из которых выполняет 12 пингов за 60 секунд.

numberOfThreads = numberOfDevices/(pollingPeriod/pingTimeout) = 100/(60/5) = 100/12 = 9 потоков

Ответ 4

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