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ę.
Czy możesz podać więcej szczegółów na temat środowiska (os, jvm)? – assylias
Harmonogram używa wywołań systemowych na poziomie systemu operacyjnego do wykonania opóźnienia, więc jeśli jest źle, masz problem niskiego poziomu. –
Możesz przynajmniej uwzględnić całkowite wykorzystanie procesora przez dwa hosty. –