Что касается создания потоков или пула потоков для 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
Я бы предложил использовать пул потоков вместо создания нового потока для каждого устройства. Пулы потоков подходят для множества задач, которые недолговечны, и ваша проблема идеально вписывается в это.