2013-01-18 71 views
1

我正在设计一个服务器,我需要能够安排数以千计的任务。该任务每5秒执行一次。 scheduledexecutorservice能够以高准确度处理数千个任务吗?我试图在一个线程中完成时间安排。但实际任务将在线程池中执行。谢谢Java计划执行器服务功能

我不确定它是如何工作的,所以如果有人可以澄清,以及它将不胜感激!

回答

0

我建议你阅读scheduler executor服务的javadocs。有没有特别的观点让你怀疑它是工业实力?您应该使用它并衡量您的性能,以检查它是否与您的用例相匹配。

而且,除非你有你不应该与库类的实现鼓捣强有力的理由(隔离客户端上的调度和任务执行线程)

但是,你应该评估使用库的石英如果您调度准则预计会变得复杂 - 超出了调度程序执行器服务提供的基本用例。

+0

你应该在你写答案时尝试回答这个问题,但是要感谢 – Tukhes

3

ScheduledExecutorService由一个线程池支持。粗略地说,你可以计算同时运行任务所需的线程数,而不使用下列公式延迟:

在池中的线​​程的最小数目等于平均每秒次平均任务运行时

执行的任务

例如,平均起来2个任务需要3秒(平均)完成,您需要6个线程。当然,这假定任务的分配随着时间的推移相当均匀。

您也可以使用Executors.newCachedThreadPool(),它理论上可以同时运行无数个任务。显然可用的内存和上下文切换的数量将大大减少这个数字。

如果您的使用场景是:运行数千个任务,每五秒在同一时间点执行一次 - 无论是JVM还是任何其他平台都无法处理。即使你有成千上万的线程,你也受到CPU核心数量的限制。准确性高度依赖于你的任务的性质(CPU密集型?阻塞I/O?)

+0

这些任务是否在他们的计时期间创建了一个线程?就像如果我在5秒钟内运行一个任务,它会打开一个新线程/立即使用一个nee线程,或者直到5秒后才启动? – Tukhes

+0

@Tukhes:它取决于你使用哪个线程池。有些池创建*固定数量的线程,如果全部使用,则任务等待。其他* cache *已经创建了线程,因此如果必须执行新任务,则它使用缓存的一个,或者如果使用全部线程,则会创建新线程。一些线程池也会在一段时间后关闭空闲线程。 –

+0

好吧,但让我说5秒内执行任务。什么时候创建线程?现在还是5秒? @Tomasz Nurkiewicz – Tukhes