ScheduledThreadPoolExecutor迟到了

时间:2012-07-03 07:39:23

标签: java scheduling

我有这个简单的代码片段:

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(10);

    Runnable r = new Runnable() {

        @Override
        public void run() {
            System.err.println(Calendar.getInstance().getTime());
        }
    }; 

    exec.scheduleAtFixedRate(r,0, 500, TimeUnit.MILLISECONDS);
}

在一台计算机上,此代码按预期运行。控制台输出:

  • Tue Jul 03 10:32:34 EEST 2012
  • Tue Jul 03 10:32:34 EEST 2012
  • Tue Jul 03 10:32:35 EEST 2012
  • Tue Jul 03 10:32:35 EEST 2012
  • Tue Jul 03 10:32:36 EEST 2012
  • Tue Jul 03 10:32:36 EEST 2012 ...

但是在另一台机器上,控制台上的时间戳显示ScheduledThreadPoolExecutor迟到了。迟到我的意思是几秒钟:)

  • Tue Jul 03 10:32:34 EEST 2012
  • Tue Jul 03 10:32:37 EEST 2012
  • Tue Jul 03 10:32:40 EEST 2012
  • Tue Jul 03 10:32:44 EEST 2012
  • Tue Jul 03 10:32:50 EEST 2012
  • Tue Jul 03 10:32:55 EEST 2012 ...

代码成功运行的第一台机器的详细信息:

I3 Windows 7 64位 JRE 1.6.0.30

调度迟到的第二台机器的详细信息:

双核心 Windows XP 32位 JRE 1.6.0.18

我想知道为什么会有这样的差异。有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

实际上,计划计时器不准确,它按cpu刻度计算时间。 因此,如果您的机器负载太重,可能会有一些延迟。 检查你的第二台机器的负载!