Aktuelle Uhrzeit per Anwendung

DEvent

Bekanntes Mitglied
Hallo,
ich habe 2 Anwendungen, die auf verschiedene Computer laufen. Nun muss eine Aktion relativ gleichzeitig ausgeführt werden. Um die gleiche Uhrzeit auf den beiden Computer zu benutzen, frage ich einen Zeitserver ab.

Nun muss ich aber diese Aktion in 5 Sekunden Intervallen ausführen. Wie löst man so ein Problem?

Ich habe das z. Z. so gelöst, dass man jedes mal den Zeitserver abfragt, die entsprechende Zeit abwartet und die Aktion in dem Intervall ausführt. Kann man es so lösen, dass ich nur einmal den Zeitserver abfragen muss und dann immer diese Uhrzeit verwende?

System.currentTimeMillis() gibt mir die Zeit der JVM ab. Die ist verschieden für verschiedene JVMs, auch auf dem selben Computer. Siehe auch hier Java: Time Synchronization Trick in Programming | twit88.com

Am einfachsten wäre es wenn ich die Zeit der JVM auf die Uhrzeit des Zeitservers setzen würde.
Am liebsten wäre mir eine vorgefertigte Bibliothek, die das Problem löst.

Ich denke ich kann auch nicht Thread.sleep(1000) verwenden um die Sekunden ab zumessen, weil Thread.sleep() auch bestimmt mit der Zeit der JVM läuft, so dass ich nach X Thread.sleep(1000) dann die Zeit nicht mehr mit der Uhrzeit des Zeitservers übereinstimmt.
 
Was heißt denn "relativ gleichzeitig": "1ms Unterschied ist Weltuntergang, aber +- 2 nanosekunden ist noch zu verkraften" oder "sollte so ungefähr im gleichen Jahr passieren"?
 
Es sollte in der gleichen Sekunde passieren, mehr will ich eigentlich nicht.
Z.B. die Aktion auf beiden Computern soll 05:12:30 passieren und dann die nächste 05:12:35, die nächste 05:12:40, usw. Die Aktion selbst dauert <1 bis <5 Sekunden, also z.B. 3,4 Sekunden oder 0,7 Sekunden.
 
Kann man es so lösen, dass ich nur einmal den Zeitserver abfragen muss und dann immer diese Uhrzeit verwende?

Betriebssysteme machen das ja auch so. Wenn Du schon eine Timeserver-Library hast, lass doch einen Thread laufen, der 10 mal in der Sekunde aufwacht um einen oder mehrere Jobs anzustoßen. Eine Art "Referenzzeit-Job" dient dazu, eine Referenzzeit zu berechnen, indem er z. B. alle 5 Min. den Zeitserver abfragt und sich zur gelieferten Zeit den Wert von System.currentTimeMillis merkt. Daraus kann der Thread die Referenzzeit berechnen, um zu entscheiden ob der echte Job laufen muss.

Sehen sich die Rechner im Netz? Was spricht denn sonst gegen eine Master/Slave Lösung?
 
Zuletzt bearbeitet:
Das mit der Referenzzeit ist eine gute Idee, darauf den Wert von System.currentTimeMillis zu merken bin ich nicht gekommen. Dann kann ich einfach System.currentTimeMillis+(1000*5) abwarten und schon habe ich meine 5 Sekunden zur selben Zeit.

Ich denke einfach einen Zeitserver abzufragen ist einfacher als Master/Slave Lösung. Dann müssen die 2 Computer auch nicht im selben Netzwerk sein und ich kann mir die Latenzberechnungen ersparen (weil ein Zeitserver die Latenz ja bereits mitberechnet). Auf dem Computer kann ja selbst auch ein Zeitserver dann laufen, der einen Master-Zeitserver abfragt.
 
Zuletzt bearbeitet:

Zurück
Oben