1

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

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

4

2 回答 2

4

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

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

于 2009-10-03T17:25:15.470 回答
1

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

但是据我所知,ScheduledExecutorService 可以保证准确性。因此,即使您的测量结果表明这是准确的,但如果您切换到不同的平台 vm 或 jdk ,情况可能并非如此。

于 2009-10-03T12:38:33.650 回答