Java计划执行程序服务功能

时间:2013-01-18 17:59:28

标签: java scheduled-tasks scheduledexecutorservice

我正在设计一台服务器,我需要能够安排数千个任务。任务每5秒执行一次。 scheduledexecutorservice是否能够以高精度处理数千个任务?我试图在一个线程中进行计时。但实际任务将在线程池中执行。感谢

我不确定它究竟是如何运作的,所以如果有人能澄清它也会受到赞赏!

2 个答案:

答案 0 :(得分:3)

ScheduledExecutorService由线程池支持。粗略地说,您可以使用以下等式计算并发运行任务所需的线程数而无延迟:

  

池中的最小线程数等于每秒平均任务运行时间执行的平均任务数

例如,平均而言,你需要花费3秒(平均)完成2个任务才能完成,你需要6个线程。当然,这假设任务的分布相当均匀。

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

如果您的使用场景是:运行数千个任务,每五秒钟在同一时间点安排 - JVM和任何其他平台都不会处理这个问题。即使您有数千个线程,您也受到CPU核心数量的限制。准确性在很大程度上取决于您的任务的性质(CPU密集型?阻塞I / O?)

答案 1 :(得分:0)

我建议您阅读调度程序执行程序服务的javadoc。是否有任何特殊的观点让你怀疑它的工业实力。您应该使用它并测量您的性能以检查它是否与您的用例匹配。

另外,除非你有充分的理由不应该修改库类的实现(在客户端隔离调度和任务执行线程)

但是,如果您的调度标准变得复杂,则应使用像quartz这样的库进行评估 - 超出调度程序执行程序服务提供的基本用例。