2012-07-03 2 views
7

私はこの単純なコードスニペットは:期待通りに一台のマシン上でのScheduledThreadPoolExecutorなっ後半

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

、このコードが実行されます。コンソール出力:

  • 火7月3日10時32分34秒EEST 2012
  • 火7月3日10時32分34秒EEST 2012
  • 火7月3日10時32分35秒EEST 2012
  • 火7月03午前10時32分35秒EEST 2012
  • 火7月3日10時32分36秒EEST 2012
  • 火7月3日10時32分36秒EEST 2012 ...

しかし、別のマシンでは、コンソールのタイムスタンプがScheduledThreadPoolExecutorが遅くなっていることを示します。後半に取得することによって、私は秒のカップルを意味:)

  • 火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 2012 ...
コードが正常に実行されている最初のマシンのの

詳細:

i3の Windows 7の64ビット JRE 1.6.0.30遅れてスケジューリングした第2のマシンの

詳細:

デュアルコア のWindows XP 32ビット JRE 1.6.0.18

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

ありがとうございます。

+1

環境(os、jvm)の詳細について教えてください。 – assylias

+0

スケジューリングはOSレベルのシステムコールを使用して遅延を実行します。これが間違っていると、レベルの問題が発生します。 –

+2

少なくとも、2つのホストの合計CPU使用率を含めることができます。 –

答えて

1

実際にはスケジュールタイマーが正確ではないため、CPUの時間単位で時間を計算します。 あなたのマシンの負荷が大きすぎる場合、多少の遅延が生じる可能性があります。 2台目のマシンの負荷を確認してください!

関連する問題