我正在设计一个服务器,我需要能够在其中安排数千个任务。该任务每 5 秒执行一次。调度执行器服务是否能够准确地处理数千个任务?我试图在一个线程中进行计时。但实际任务将在线程池中执行。谢谢
我不确定它究竟是如何工作的,所以如果有人能澄清这一点,我将不胜感激!
我正在设计一个服务器,我需要能够在其中安排数千个任务。该任务每 5 秒执行一次。调度执行器服务是否能够准确地处理数千个任务?我试图在一个线程中进行计时。但实际任务将在线程池中执行。谢谢
我不确定它究竟是如何工作的,所以如果有人能澄清这一点,我将不胜感激!
ScheduledExecutorService
由线程池支持。粗略地说,您可以使用以下等式计算无延迟地同时运行任务所需的线程数:
池中的最小线程数等于每秒执行的平均任务数乘以平均任务运行时间
例如,平均而言,您启动 2 个任务需要 3 秒(平均)完成,您需要 6 个线程。当然,这假设随着时间的推移任务分布相当均匀。
您还可以使用Executors.newCachedThreadPool()
which 理论上可以同时运行无限数量的任务。显然可用内存和上下文切换的数量会大大减少这个数量。
如果您的使用场景是:每五秒在完全相同的时间点运行数千个任务计划 - JVM 和任何其他平台都不会处理这个问题。即使你有数千个线程,你也会受到 CPU 内核数量的限制。准确性很大程度上取决于任务的性质(CPU 密集型?阻塞 I/O?)
我建议您阅读调度程序执行器服务的 javadocs。有没有什么特别的地方让你怀疑它的工业实力。您应该使用它并测量您的性能以检查它是否与您的用例匹配。
此外,除非您有充分的理由,否则您不应该修改库类的实现(在客户端分离调度和任务执行线程)
但是,如果您的调度标准预计会变得复杂 - 超出调度程序执行程序服务提供的基本用例,您应该使用像quartz这样的库进行评估。