我ScheduledExecutorService.scheduleAtFixedRate
用来运行日常任务,如下所示:
executor.scheduleAtFixedRate(task, d, 24L * 3600 * 1000, TimeUnit.MILLISECONDS);
(d
是以毫秒为单位的初始延迟)。
执行器由Executors.newSingleThreadScheduledExecutor()
多个任务创建并运行,但它们都安排在几个小时之内,最多需要几分钟。
我知道 ScheduledExecutorService 不保证准确性,我需要一个实时操作系统和 JVM 来获得它。不过,这不是我的任务的要求。
我注意到,在使用 JDK 1.7.0_03 的 Windows 2003 Server 上,任务每天会延迟近 10 秒。每月大约需要 5 分钟,这对于我的申请来说是可以接受的。无论如何,我可能不得不实施重新调度,因为我希望任务在特定的本地时间运行,所以我必须自己处理 DST。该服务运行时间很长——半年不重启并不稀奇。
尽管如此,我认为对于一个大部分空闲的系统来说,每天 10 秒的不准确性是相当高的,我想知道我是否应该为更糟糕的行为做好准备。
所以我的问题是关于你的经历scheduleAtFixedRate
。10秒/天正常吗?我在其他环境(我们的客户也使用 Linux 和 Solaris 服务器)中会获得更好或更差的准确性吗?或者这 10 秒是否表明我们的环境有问题?