ho questo semplice frammento di codice:ScheduledThreadPoolExecutor facendo tardi
/**
* @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);
}
su una macchina, questo codice viene eseguito come previsto. output della console:
- mar 3 luglio 10:32:34 EEST 2012
- mar 3 luglio 10:32:34 EEST 2012
- mar 3 luglio 10:32:35 EEST 2012
- Tue luglio 03 10:32:35 2012 EEST
- mar 3 luglio 10:32:36 EEST 2012
- mar 3 luglio 10:32:36 EEST 2012 ...
Tuttavia su un'altra macchina, la data/ora sulla console mostra che ScheduledThreadPoolExecutor si sta facendo tardi. Ottenendo tardi intendo un paio di secondi :)
- mar 3 luglio 10:32:34 EEST 2012
- mar 3 luglio 10:32:37 EEST 2012
- mar 3 luglio 10:32: 40 EEST 2012
- mar 3 luglio 10:32:44 EEST 2012
- mar 3 luglio 10:32:50 EEST 2012
- mar 3 luglio 10:32:55 EEST 2012 ...
dettagli di prima macchina su cui codice viene eseguito con successo:
i3 di Windows 7 a 64 bit JRE 1.6.0.30
dettagli di seconda macchina su cui la pianificazione in ritardo:
Dual Core Windows XP 32 bit JRE 1.6.0.18
Mi chiedo perché c'è una tale differenza. Eventuali suggerimenti ?
Grazie in anticipo.
Puoi fornire maggiori dettagli sull'ambiente (os, jvm)? – assylias
La pianificazione utilizza chiamate di sistema a livello di sistema operativo per eseguire il ritardo, quindi se questo è sbagliato, si ha un problema di basso livello. –
È possibile includere almeno l'utilizzo totale della CPU dei due host. –