关于 100 个任务的线程创建或线程池

2022-09-03 14:30:14

我正在创建一个可以监视100-150个设备的监视应用程序...现在要设计一个监视器应用程序,我有两种方法:

  1. 为要监视的每个设备创建一个线程,每个线程将 ping(使用 ICMP)到设备,以了解设备是否处于联机状态。这些线程将无限期运行,以便在特定时间间隔(例如 60 秒)后知道其状态。

  2. 创建一个线程池,并为每个设备提交一个任务到一个线程池。任务是简单地 ping 到设备。因此,在当前设计中,任务将超过线程池中的线程。例如,假设有 100 个设备要监视,将有 100 个任务要监视,线程池将有 40 个线程来完成这 100 个任务。当然,运行下一组任务的持续时间将是这样的,即完成线程池中的所有挂起任务。

哪种方法会更好?


答案 1

我会创建一个 ScheduledExecutorService(例如,通过 Executors.newScheduledThreadPool),允许你安排重复的 ping。您知道每个 ping 可能需要多长时间吗?我希望你可以用很少的线程逃脱 - 如果你只需要每分钟ping一次100个设备中的每个设备,则远远少于40个。

你可以从相当少的线程开始它 - 但要注意Mark Peters在注释中提出的信息 - 使用的实现不会扩展(正如我所期望的那样);它实际上是一个固定的线程池。不过,你应该能够用少于40个...


答案 2

为每个设备创建单独的线程不是可扩展的解决方案。想象一下,如果您的解决方案必须与增加的设备数量一起使用,例如从100个到1000个;你不能每次都继续生成一个单独的。

创建线程池将是一个理想的解决方案。您可以根据要求和资源可用性调整线程池的大小。如果您需要在固定间隔后定期ping设备,则可以使用计划的执行器服务,该服务在内部负责定期计划任务。但是,是的,使用线程池是令人讨厌的选择。