1

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

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

回答

4

“正常”的Java VM不能对执行时间(以及由此也关于调度时间)做出任何硬实时保证。如果你确实需要实时保证,你应该看看像Java RTS这样的实时虚拟机。当然你也需要一个实时操作系统。

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

1

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

但据我所知在ScheduledExecutorService中有关于精度的保证。因此,即使您的衡量标准显示这是严重错误,但如果您切换到其他平台,vm或jdk,情况可能并非如此。

+2

因为这个类经常在内部使用其他类,所以我很难遵循它。但我认为这可能是相关的: 我发现任务被放入一个PriorityQueue中,它可能按优先级排序任务,这意味着它们的预期执行时间。因此,似乎确实没有实时保证。 但为什么这种方法比睡眠(速度)更好?也许这个队列能够以比例如垃圾收集器更高的优先级运行线程,以便能够近乎实时地执行任务? – Markus 2009-10-03 15:10:01

+0

你的意思是“据我所知没有任何保证”? – 2012-01-16 22:00:42

相关问题