如何以保证的固定速率安排Java任务,与任务运行时无关?

时间:2014-07-15 09:02:56

标签: java timeout scheduled-tasks

如果想要以特定间隔安排任务,那么java.util.Timer的scheduleAtFixedRate是一个显而易见的选择。但是,如果你的间隔是10秒。并且任务需要超过10秒。根据文档,此函数将忙于执行任何待处理的任务(引用:两次或更多次执行将快速连续发生以“赶上”。)。这当然是实现它的合理方式,但它不一定是你想要的。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

经过一些(重新)搜索,我相信scheduleWithFixedDelayScheduledExecutorService方法正是如此。

答案 2 :(得分:0)

我认为这完全符合您的要求。 Java.util.timer - > schedule(TimerTask任务,长延迟,长周期)。这用"固定延迟"执行。 根据文档:在固定延迟执行中,每次执行都是相对于上一次执行的实际执行时间进行调度的。如果执行因任何原因(例如垃圾收集或其他后台活动)而延迟,则后续执行也将延迟。