2010-08-12 2 views
6

Ich habe eine Box, die ntp verwendet und wir haben mehrere Java-Programme, die auf ihnen laufen, die eine Uhr anzeigen. Das Problem, das wir haben, ist, wenn irgendwas die Systemzeit nach hinten versetzt, all unsere Timer, die Dinge wie die Uhr stoppen und warten, bis die Systemzeit wieder da ist, wo sie war. Ich muss einen Weg finden, entweder zu erkennen, wenn die Systemzeit rückwärts geändert wurde, und alle unsere Timer oder eine Reihe von Timern zurückzusetzen, die wiederholt planen können, aber immer noch gegen die Änderung der Uhr beweisen.Ermitteln, ob die Systemzeit rückwärts in Java verschoben wurde, oder Zeitprüfzeitgeber

Als Hinweis habe ich bereits das Quarz-Timer-Paket ausprobiert es hat das gleiche Problem wie die regulären Java-Timer.

+0

Wie weit ist die Uhr zurück? ntp verwendet normalerweise die Taktsynchronisation, um die Uhr in beide Richtungen zu bewegen, und sollte sie nicht um eine große Anzahl von Sekunden ändern müssen. – Gray

+0

Es gibt einen Fehler im System, der die Zeit um 3 oder 4 Stunden zurückwirft. Fast so, als hätten wir zwei konkurrierende NTP-Server, denen wir nicht zustimmen können. – tharris

Antwort

5

So ziemlich alle Timer stellen eine zukünftige Zeit ein und vergleichen dann regelmäßig die aktuelle Zeit mit der gegebenen Zeit. Das ist der Grund, warum Timer "stehen bleiben", wenn Echtzeit rückwärts geht.

Leider beziehen sich ALLE Timer in der JVM auf die Uhrzeit. Beispiel: java.util.Timer führt ein Object.wait (Millisekunden) für das Auslösen eines Ereignisses aus. Das läuft auf einen Thread-Aufruf hinaus, der auch eine Wartezeit für t Millisekunden ausführt. Und es ist immer relativ zur "Tageszeit".

Also, im Grunde gibt es keine echte Möglichkeit, dies in Java ohne eine drehende CPU-Saugschleife zu tun, die auf die Zeit wartet, rückwärts zu gehen, um die Timer zu informieren, die Sie zurücksetzen möchten.

+0

Ja, das ist auch das, was ich herausgefunden habe, aber ich habe festgestellt, dass Thread.sleep() immun gegen die Systemuhr ist, die geändert wird Ich könnte also einen Thread haben, der für 1 schläft Sekunde prüft dann, um zu sehen, ob sich Zeit rückwärts bewegt hat. – tharris

1

Es klingt wie das Uhr Widget ist, was kaputt ist. Ein UI-Widget sollte den aktuellen Status des Modells anzeigen, wobei das Modell in diesem Fall die Systemzeit ist. Sicher, für eine Uhr müssten Sie jede Sekunde eine repaint() einplanen, aber wenn das Repaint auftritt, sollte es die Systemzeit wiedergeben, nicht versuchen, die Zeit selbst zu verfolgen.

Dieser Grundsatz gilt auch für Nicht-UI-Komponenten. Ermitteln Sie die Toleranz der Komponente für Timing-Fehler und verfügen Sie über einen Hintergrundthread, der die Komponente in diesem Intervall aktualisiert. Während einer Aktualisierung wird jedoch die Systemzeit verwendet, keine unabhängige interne Uhr.


Update:

Der Grund ScheduledExecutorService nicht unter diesem Problem leidet, zumindest auf meiner Plattform.

ScheduledExecutorService worker = Executors.newScheduledThreadPool(1); 
worker.schedule(new Runnable() { 
    public void run() 
    { 
    update(); 
    } 
}, 100, TimeUnit.MILLISECONDS); 
+0

Das Problem ist nicht, dass die Widgit versucht, die Zeit selbst zu verfolgen, es ruft neue Date() einmal pro Sekunde, dass, wenn Sie Systemzeit rückwärts verschieben, dann die Java-Timer, die tatsächlich aktualisieren/animieren die Uhr pausieren ihre Ausführung bis Das System fängt wieder an, wo es vorher war. – tharris

+0

@Tharris - Ich verstehe; Ich war vorher nicht auf dieses Problem gestoßen. Die von mir verwendete "ScheduledExecutorService" -Implementierung scheint jedoch immun gegen das Problem zu sein und hat eine API, die der 'Timer'-Klasse ähnlich ist (obwohl sie Teil des neueren und weitaus robusteren' java.util.concurrent'-Pakets ist). Siehe mein Update für ein Beispiel. – erickson

+0

@erickson :(Dies funktioniert nicht mit Ubuntu 11.10 Java 6 Update 26. Ich habe jetzt auch eine Frage zum gleichen http://StackOverflow.com/Questions/9044423/Java-Scheduler-Which-ist-vollständig-unabhängig-von -system-time-änderungen – YoK

Verwandte Themen