【问题标题】:Java Scheduled Executor Service CapabilitiesJava Scheduled Executor 服务能力
【发布时间】:2013-01-02 12:16:04
【问题描述】:

我正在设计一个服务器,我需要能够在其中安排数千个任务。该任务每 5 秒执行一次。调度执行器服务是否能够准确地处理数千个任务?我试图在一个线程中进行计时。但实际任务将在线程池中执行。谢谢

我不确定它究竟是如何工作的,所以如果有人能澄清这一点,我将不胜感激!

【问题讨论】:

    标签: java scheduled-tasks scheduledexecutorservice


    【解决方案1】:

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

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

    例如,平均而言,您启动 2 个任务需要 3 秒(平均)完成,您需要 6 个线程。当然,这假设随着时间的推移任务分布相当均匀。

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

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

    【讨论】:

    • 任务是否在其计时周期内创建线程?就像我在 5 秒内运行一个任务时,它会立即打开一个新线程/使用一个 nee 线程,还是在 5 秒后才这样做?
    • @Tukhes:这取决于您使用的线程池。一些池创建 固定 数量的线程,如果全部使用,您的任务会等待。其他 cache 已经创建了线程,因此如果必须执行新任务,它要么使用缓存的线程,要么池创建新线程(如果全部使用)。一些线程池也会在一段时间后关闭空闲线程。
    • 好的,但假设我在 5 秒内执行任务。什么时候创建线程?现在还是 5 秒后? @Tomasz Nurkiewicz
    • @Tukhes:完全取决于您选择的线程池。您可以提前或懒惰地创建所有内容。如果懒惰,线程只会在需要时创建,即 5 秒后。但它会在空闲状态下存活并在另外 5 秒后重新使用。
    • 现在我的意思是当我启动我的应用程序时不需要安排任务@tomasz nurkiewicz
    【解决方案2】:

    我建议您阅读调度程序执行器服务的 javadocs。有没有什么特别的地方让你怀疑它的工业实力。您应该使用它并衡量您的性能,以检查它是否符合您的用例。

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

    但是,如果您的调度标准预计会变得复杂 - 超出调度程序执行程序服务提供的基本用例,您应该使用类似quartz 的库进行评估。

    【讨论】:

    • 您应该在写回答者时尝试回答问题,但无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2023-03-10
    • 2020-05-13
    • 2020-12-31
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多