因为我每秒都在执行一个时间紧迫的任务,所以我比较了几种方法,以找到确保我的任务真正以固定时间步长执行的最佳方法。在计算所有方法的误差的标准推导之后,似乎使用该方法scheduledExecutorService.scheduleAtFixedRate()
会导致最好的结果,但我不知道为什么会这样。
有人知道这种方法在内部是如何工作的吗?例如,与简单的sleep()
确保引用的任务真正以固定时间步长执行相比,它如何?
因为我每秒都在执行一个时间紧迫的任务,所以我比较了几种方法,以找到确保我的任务真正以固定时间步长执行的最佳方法。在计算所有方法的误差的标准推导之后,似乎使用该方法scheduledExecutorService.scheduleAtFixedRate()
会导致最好的结果,但我不知道为什么会这样。
有人知道这种方法在内部是如何工作的吗?例如,与简单的sleep()
确保引用的任务真正以固定时间步长执行相比,它如何?
“正常”的 Java VM 无法对执行时间做出任何硬实时保证(因此也无法保证调度时间)。如果你真的需要硬实时保证,你应该看看像Java RTS这样的实时 VM 。当然,在这种情况下你也需要一个实时操作系统。
关于与 Thread.sleep() 的比较:scheduleExecutorService.scheduleAtFixedRate() 与 Thread.sleep() 的(天真)使用相比的优势在于它不受计划任务的执行时间的影响。请参阅 ScheduledFutureTask.runPeriodic() 了解如何实现。
您可以查看 ScheduledThreadPoolExecutor.java 的 OpenJDK7 实现,它是唯一实现 ScheduledExecutorService 接口的类。
但是据我所知,ScheduledExecutorService 可以保证准确性。因此,即使您的测量结果表明这是准确的,但如果您切换到不同的平台 vm 或 jdk ,情况可能并非如此。