【发布时间】:2010-04-30 15:55:28
【问题描述】:
我正在使用 ScheduledThreadPoolExecutor 对象调度任务。我使用以下方法:
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,113 毫秒)
所以看起来两个 40 秒的 CPU 时钟之间存在差异
如何在 java 代码中解决这个问题?不幸的是,这是一台客户端机器,我无法修改他们的系统。
【问题讨论】:
-
棘手的一个。也许
java.util.Calendar会有所帮助? Calendar.getInstance() 等等.. -
您是否在虚拟机(VMWare、KVM、Virtual PC)上运行此代码?即使在毫秒级别,虚拟化也会对 CPU 时钟造成严重破坏。
-
它直接在 Windows XP Professional 机器上运行。没有虚拟化。
标签: java concurrency java.util.concurrent