ScheduledThreadPoolExecutor迟到了

uah*_*kan 7 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 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

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