由于我在执行一次重要任务每一秒,我比较了几种方法来寻找,以确保我的任务是在固定的时间步长实际执行的最佳途径。计算误差的标准推导好像用scheduledExecutorService.scheduleAtFixedRate()导致最佳结果的方法的所有方法之后,但我没有线索,为什么它是如此。

是否有人知道那是方法内部的工作?它是如何例如在比较简单的sleep()确保引用的任务是在固定的时间步长实际执行?

有帮助吗?

解决方案

一个“正常”的Java VM不能对执行时间任何硬实时保证(并且作为其也是关于调度次数的结果)。如果你真的需要硬实时保证你应该看看实时VM喜欢的的Java RTS 的。当然,你需要一个实时操作系统在那种情况下。

关于比较Thread.sleep()方法:scheduledExecutorService.scheduleAtFixedRate的优点()相比的Thread.sleep的(幼稚)使用()是,它不会受到调度的任务的执行时间。见ScheduledFutureTask.runPeriodic()上,这是如何实现的。

其他提示

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

不过,据我所知,在保证准确度左右的ScheduledExecutorService的。所以,即使你的观测值显示这是acurate的,如果你切换到不同的平台,虚拟机或JDK可能并非如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top