timer.schedule -

Xander_GP

Mitglied
Hallo,

ich verwende timer.schedule( timerTask, 0, 1000 );, um nach jeweils einer Sekunde auf der Konsole, die seit dem Start verstrichene Zeit in ms auszugeben.

Java:
import java.util.Timer;
import java.util.TimerTask;

public class Test {
	
	private static long startzeit;

	public static void main(String[] args) {
		Timer timer = new Timer();

		startzeit = System.currentTimeMillis();

		TimerTask timerTask = new TimerTask(){ 
			public void run(){ 
				System.out.println(System.currentTimeMillis() - startzeit);
			}
		}; 

		timer.schedule( timerTask, 0, 1000 );
	}

}

Auf der Konsole werden zum Beispiel folgende Werte ausgegeben:
Java:
0
1014
2029
3044
4059
5074
6089
7104
8119
9134

Was ich nun nicht verstehe ist, warum jeweils ca. 1015 ms vergehen, obwohl die run-Methode doch alle 1000ms aufgerufen wird!?
 
Bei mir
1
1001
2001
3001
4001
5001
6001
7001
8001
9002

Also genau 1000 Millisekunden-Differenz...

Aber das musst du NICHT genau nehmen.

Java ist kein Real-Time-System, sprich, es macht keine Garantien wie genau das Timing von solchen Abläufen eingehalten wird.

Dies kann je nach Auslastung deines Rechners und des Rechners selbst Abweichungen geben. Nur im Grossen und Ganzen versucht die JVM die Aufrufe einigermaßen zu treffen und 15 Millisekunden sind ja auch nicht schlecht, oder?
 
Interessant, dass es bei dir so genau passt.

Bei mir sind es 1,5 Hundertstel und wenn man eine Uhr mit Sekundenanzeige damit ansteuert, lässt sich ausrechenen, wann die Sekundenanzeige eine Sekunde überspringt.

Wenn es so ist, kann man nichts machen. Wollte nur mal hören, ob ich vielleicht etwas besser machen hätte können, um das Problem zu ermeiden.
 
Du kannst natürlich was dagegen tun, ist dann aber mehr Aufwand😉

Beispielsweise könntest du dir merken, das der letzte Aufruf "zu spät" (15 Millisekunden) zu spät kam und daher nun nur noch 985 Millisekunden warten zum nächsten Event musst.
 
Es ist schon seltsam. Wenn ich das Intervall von 1000ms auf 999ms reduziere und sonst alles lasse wie es ist, springt er im Wechsel zwischen 1015 und 1000.
 
Was soll daran seltsam sein? Wenn du 1000 angibst, sind es mindestens 1000 zwischen zwei aufrufen, wenn du 999 sind es mindestens 999 zwischen zwei aufrufen.

Die Zeit, die du angibst, ist das Minimum. Alles andere obliegt dem Prozessor, ob er dich dann arbeiten lässt oder nicht. Darauf hast du null Einfluss. Null.
 
Seltsam ist, dass es die zwei Werte, die sich abwechseln, gleich bleiben. Würde der Wert zufällig schwanken, würde es eher zu einer Erklärung passen.
 

Neue Themen


Zurück
Oben