方法scheduledExecutorService.scheduleAtFixedRate()如何确保实时执行?

时间:2009-10-03 11:27:15

标签: java scheduled-tasks real-time sleep scheduledexecutorservice

因为我每秒都在执行一个时间关键任务,所以我比较了几种方法,以找到确保我的任务在固定时间步骤中真正执行的最佳方法。在计算所有方法的误差的标准推导之后,似乎使用方法scheduledExecutorService.scheduleAtFixedRate()导致最佳结果,但我不知道为什么会这样。

有人知道这种方法在内部是如何运作的吗?与简单的sleep()相比,它如何确保引用的任务确实在固定的时间步骤中执行?

2 个答案:

答案 0 :(得分:4)

“普通”Java VM无法对执行时间做出任何硬实时保证(因此也会对调度时间产生影响)。如果你真的需要硬实时保证,你应该看看像Java RTS这样的实时虚拟机。当然,在这种情况下你也需要一个实时操作系统。

关于与Thread.sleep()的比较:scheduledExecutorService.scheduleAtFixedRate()与Thread.sleep()的(天真)使用相比的优点是它不受计划任务的执行时间的影响。请参阅ScheduledFutureTask.runPeriodic()了解如何实现它。

答案 1 :(得分:1)

您可以查看ScheduledThreadPoolExecutor.java的OpenJDK7实现,它是实现ScheduledExecutorService接口的唯一类。

但据我所知,ScheduledExecutorService中有关于准确性的保证。因此,即使您的测量显示这是准确的,如果您切换到不同的平台,vm或jdk可能不是这种情况。