我正在使用ScheduledThreadPoolExecutor对象调度任务。我使用下面的方法:ScheduledThreadPoolExecutor由于CPU时间差异而执行错误的时间
public ScheduledFuture<?> schedule(Runnable command, long delay,TimeUnit unit)
和设置延迟为30秒(延迟= 30,000和单元= TimeUnit.MILLISECONDS)。有时我的任务会立即发生,其他时间需要70秒。
我相信ScheduledThreadPoolExecutor使用CPU特定的时钟。当我运行比较System.currentTimeMillis的(),System.nanoTime()[其为CPU具体]试验我看到以下
时间表:1272637682651ms,7858346157228410ns
执行:1272637682667ms,7858386270968425ns
差16毫秒但4011374001ns(或40,113ms)
,所以它看起来像有40秒
两款CPU时钟之间的矛盾如何解决这个问题,我n java代码?不幸的是,这是一台客户机,我无法修改他们的系统。
棘手的一个。也许'java.util.Calendar'会有帮助吗? Calendar.getInstance()等等。 – 2010-04-30 16:00:37
你是否在虚拟机(VMWare,KVM,Virtual PC)上运行此代码?即使在毫秒级别,虚拟化也会对CPU时钟造成严重破坏。 – 2010-05-01 07:17:17
它直接在Windows XP Profession机器上运行。没有虚拟化。 – richs 2010-05-03 13:13:51