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);
}

1台のマシンでは、このコードは期待どおりに実行されます。コンソール出力:

  • 7月3日火曜日10:32:34EEST2012
  • 7月3日火曜日10:32:34EEST2012
  • 7月3日火曜日10:32:35EEST2012
  • 7月3日火曜日10:32:35EEST2012
  • 7月3日火曜日10:32:36EEST2012
  • 7月3日火曜日10:32:36EEST2012..。

ただし、別のマシンでは、コンソールのタイムスタンプに、ScheduledThreadPoolExecutorが遅くなっていることが示されています。遅くなるということは、数秒という意味です:)

  • 7月3日火曜日10:32:34EEST2012
  • 7月3日火曜日10:32:37EEST2012
  • 2012年7月3日火曜日10:32:40EEST
  • 7月3日火曜日10:32:44EEST2012
  • 7月3日火曜日10:32:50EEST2012
  • 7月3日火曜日10:32:55EEST2012..。

コードが正常に実行される最初のマシンの詳細:

i3 Windows764ビットJRE1.6.0.30

スケジューリングが遅れて実行されている2番目のマシンの詳細:

デュアルコアWindowsXP32ビットJRE1.6.0.18

なぜそんな違いがあるのだろうか。助言がありますか ?

前もって感謝します。

4

1 に答える 1

1

実際には、スケジュール タイマーは正確ではなく、CPU ティックで時間を計算します。そのため、マシンの負荷が高すぎる場合、遅延が発生する可能性があります。2 台目のマシンの負荷を確認してください。

于 2012-07-03T09:41:37.387 に答える