2012-07-03 8 views
7

Mam ten prosty fragment kodu:ScheduledThreadPoolExecutor późno

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

na jednej maszynie, ten kod działa zgodnie z oczekiwaniami. Wyjście Konsola:

  • Wto 03 lipca 10:32:34 EEST 2012
  • Wto 03 lipca 10:32:34 EEST 2012
  • Wto 03 lipca 10:32:35 EEST 2012
  • Wto lipca 03 10:32:35 EEST 2012
  • Wto 03 lipca 10:32:36 EEST 2012
  • Wto 03 lipca 10:32:36 EEST 2012 ...

Jednak na innym komputerze sygnatura czasowa na konsoli pokazuje, że ScheduledThreadPoolExecutor się spóźnia. Za późno Znaczy kilka sekund :)

  • Wto 03 lipiec 10:32:34 EEST 2012
  • Wto 03 lipiec 10:32:37 EEST 2012
  • Wt lip 03 10:32: 40 EEST 2012
  • Wto 03 lipca 10:32:44 EEST 2012
  • Wto 03 lipca 10:32:50 EEST 2012
  • Wto 03 lipca 10:32:55 EEST 2012 ...

Szczegóły pierwszej maszyny, na których kod jest uruchamiany pomyślnie:

i3 Windows 7 64 bit JRE 1.6.0.30

Szczegóły drugim komputerze na którym szeregowanie spóźniony:

Dual Core Windows XP 32 bit JRE 1.6.0.18

Zastanawiam się, dlaczego jest taka różnica. Jakieś sugestie ?

Z góry dziękuję.

+1

Czy możesz podać więcej szczegółów na temat środowiska (os, jvm)? – assylias

+0

Harmonogram używa wywołań systemowych na poziomie systemu operacyjnego do wykonania opóźnienia, więc jeśli jest źle, masz problem niskiego poziomu. –

+2

Możesz przynajmniej uwzględnić całkowite wykorzystanie procesora przez dwa hosty. –

Odpowiedz

1

Rzeczywiście licznik czasu nie jest dokładny, oblicza czas za pomocą cpu. , więc jeśli obciążenie urządzenia jest zbyt duże, może wystąpić opóźnienie. sprawdź obciążenie drugiej maszyny!

Powiązane problemy