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

时间:2012-05-21 05:34:57

标签: java multithreading threadpool

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

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

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

  3. 哪种方法会更好?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:2)

为每个设备创建单独的线程不是可扩展的解决方案。试想一下,如果你的解决方案必须使用更多的设备,比如100到1000;你不能每次都独立产卵。

创建线程池将是一个理想的解决方案。您可以根据需求和资源可用性调整线程池的大小。如果您需要在固定的时间间隔后以经常性方式ping设备,那么您可以使用预定的执行程序服务,该服务在内部负责定期安排任务。但是,使用线程池是一种明显的选择。

答案 2 :(得分:2)

在计算最大线程数时,您应该考虑ping超时。 如果ping超时为5秒,并且重复周期为60秒,那么有多少线程需要ping 100个设备?

在60秒内,每个线程可以执行12次设备ping(60秒允许12次ping在5秒后超时)。 这意味着你需要至少9个线程,每60秒执行12次ping。

numberOfThreads = numberOfDevices /(pollingPeriod / pingTimeout)= 100 /(60/5)= 100/12 = 9个帖子

答案 3 :(得分:1)

我建议使用线程池,而不是为每个设备创建一个新线程。线程池适用于很多持续时间较短的任务,您的问题非常适合这一点。