Java scheduleAtFixedRate慢/晚

Java scheduleAtFixedRate慢/晚,java,timing,executorservice,Java,Timing,Executorservice,我使用scheduleAtFixedRate方法每小时更新一次数据库。问题是它逐渐变晚了——在长期服务中,我一直在记录它,每天大约一秒钟 我开了一个小班只是为了研究这一方面——当运行WinXP的PC上没有任何事情发生时,它似乎工作得很好,但如果事情发生了,它会很快变得更晚。昨晚18:00:00.5是它的第一个日志,今天早上是09:00:00.5,然后是10:00:05.9,11:00:26.8,12:00:45.3,13:01:07.8 我可以附加代码,尽管我的示例不是最小的 还有其他人经历过吗

我使用scheduleAtFixedRate方法每小时更新一次数据库。问题是它逐渐变晚了——在长期服务中,我一直在记录它,每天大约一秒钟

我开了一个小班只是为了研究这一方面——当运行WinXP的PC上没有任何事情发生时,它似乎工作得很好,但如果事情发生了,它会很快变得更晚。昨晚18:00:00.5是它的第一个日志,今天早上是09:00:00.5,然后是10:00:05.9,11:00:26.8,12:00:45.3,13:01:07.8

我可以附加代码,尽管我的示例不是最小的

还有其他人经历过吗?你知道这为什么不能正常工作吗

我可以想出很多方法来解决这个问题,但我真的很想知道为什么它不能像广告上说的那样工作


谢谢,迈克,这是正常的。使用,如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始。话虽如此,我还是推荐你。这将确保任务在指定的延迟间隔内执行。

否,根据JavaDoc,每次执行的持续时间应该无关紧要:从长远来看,执行频率将恰好是指定时间的倒数,前提是系统时钟基础对象。waitlong是准确的。@Thomas,你能提供一个链接吗?@Moonbean我只是觉得我用错了类计时器而不是ScheduledExecutorService。但是,您链接的JavaDoc反过来说明了您的答案:scheduleAtFixedRate应该以初始延迟+n*的速率开始,而scheduleWithFixedDelay将考虑任务的持续时间:…在一个执行的终止和下一个执行的开始之间有给定的延迟scheduleWithFixedDelay@Thomas,你看过我的答案了吗?如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始。因此,对于scheduleAtFixedRate,固定的时间间隔并不总是可能的。使用scheduleWithFixedDelay,无论任务执行时间如何,后续任务都将始终以指定的间隔启动。没错,scheduleAtFixedRate就是这样做的,很抱歉误读了。但是,我仍然宁愿使用它,而不是使用scheduleWithFixedDelay,因为OP希望执行尽可能接近整小时。此外,我怀疑更新可能需要整整一小时几秒钟,但这应该得到验证-@Michael请告诉我们: