7

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

/**
 * @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);
}

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

  • 2012 年 7 月 3 日星期二 10:32:34 EEST
  • 2012 年 7 月 3 日星期二 10:32:34 EEST
  • 2012 年 7 月 3 日星期二 10:32:35 EEST
  • 2012 年 7 月 3 日星期二 10:32:35 EEST
  • 2012 年 7 月 3 日星期二 10:32:36 EEST
  • 2012 年 7 月 3 日星期二 10:32:36 EEST ...

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

  • 2012 年 7 月 3 日星期二 10:32:34 EEST
  • 2012 年 7 月 3 日星期二 10:32:37 EEST
  • 2012 年 7 月 3 日星期二 10:32:40 EEST
  • 2012 年 7 月 3 日星期二 10:32:44 EEST
  • 2012 年 7 月 3 日星期二 10:32:50 EEST
  • 2012 年 7 月 3 日星期二 10:32:55 EEST ...

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

i3 Windows 7 64 位 JRE 1.6.0.30

调度运行延迟的第二台机器的详细信息:

双核 Windows XP 32 位 JRE 1.6.0.18

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

提前致谢。

4

1 回答 1

1

实际上调度计时器并不准确,它通过cpu ticks计算时间。所以如果你的机器负载太重,可能会有一些延迟。检查第二台机器的负载!

于 2012-07-03T09:41:37.387 回答