【问题标题】:How can I schedule Java tasks at guaranteed fixed rate, independent of task run time?如何以保证的固定速率调度 Java 任务,而与任务运行时间无关?
【发布时间】:2014-09-05 09:37:59
【问题描述】:

java.util.Timer 的 scheduleAtFixedRate 是一个明显的选择,如果你想在某个时间间隔安排任务。但是,如果您的间隔是 10 秒。任务耗时超过 10 秒。此功能将根据文档忙执行任何待处理的事情(引用:两个或更多执行将快速连续发生以“赶上”。)。这当然是一种合理的实现方式,但不一定是你想要的。

有谁知道 Java API 中用于在任务 n 之后调度任务 n+1 毫秒的标准功能,与任务 n 花费的时间无关?

我自己已经两次实现了这个功能(两个不同的项目),因为在我偶然发现的情况下,这是实现它的最正确方法。

您可能会说这是微不足道的(确实如此),但如果它不是经常发生的事情,我没有提到它。

我的主要观点是,如果“追赶”策略被认为是“正确的”,那么我的方法在很多情况下同样正确,我认为 scheduleAtFixedRate 应该包括一个选项。这对我来说不是问题,我只是想看看是否有人知道这是否已经在 J​​ava API 中实现,所以我不必时不时地编写代码。

【问题讨论】:

    标签: java timeout scheduled-tasks


    【解决方案1】:

    这将通过schedule() 方法来完成(假设正在使用java.util.Timer)。它提供固定延迟而不是固定速率。

    【讨论】:

    • 是的,我在我的实现中使用了它。但这并不能解决问题本身。我仍然需要我的实现。
    • 啊,您的意思是如果第一个任务花费的时间太长,您会希望同时运行 2 个同时执行的任务?
    • 没有。我希望任务 n+1 在任务 n 完成后运行 毫秒。
    • 那我推荐使用 Quartz Scheduler。
    • 我一直在走这条路并得出结论,大约 40 行代码比拖入 Quartz 更有吸引力:)
    【解决方案2】:

    经过一些(重新)搜索,我相信ScheduledExecutorServicescheduleWithFixedDelay 方法正是实现了这一点。

    【讨论】:

      【解决方案3】:

      我认为这正是您想要的。 Java.util.timer -> schedule(TimerTask 任务,长延时,长周期)。这以“固定延迟”执行。 根据文档:在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。如果由于任何原因(例如垃圾回收或其他后台活动)延迟执行,则后续执行也会延迟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        相关资源
        最近更新 更多