Frage

Weil ich eine zeitkritische Aufgabe jeder zweite Ausführung, verglich ich mehrere Methoden, um den besten Weg zu finden, um sicherzustellen, dass meine Aufgabe wirklich in festen Zeitschritten ausgeführt wird. Nachdem die Standardabweichung des Fehlerberechnungs für alle Methoden es wie mit Hilfe der Methode scheduledExecutorService.scheduleAtFixedRate() führt zu den besten Ergebnissen scheint, aber ich habe keine Ahnung, warum es so ist.

Weiß jemand, wie das Verfahren intern funktioniert? Wie funktioniert es zum Beispiel im Vergleich zu einem einfachen sleep() sicherzustellen, dass die referenzierte Aufgabe wirklich in festen Zeitschritten ausgeführt wird?

War es hilfreich?

Lösung

Eine ‚normale‘ Java VM können keine harten Echtzeit-Garantien über die Ausführungszeiten machen (und als Folge dieses auch zu Planungszeiten). Wenn Sie wirklich harte Echtzeitgarantien benötigen, sollten Sie einen Blick auf eine Echtzeit haben VM wie Java RTS . Natürlich müssen Sie ein Echtzeit-Betriebssystem in diesem Fall auch.

Bezüglich Vergleichs zu Thread.sleep (): Vorteile scheduledExecutorService.scheduleAtFixedRate () im Vergleich zu einer (naiven) Nutzung von Thread.sleep () ist, dass sie nicht durch die Ausführungszeit der geplanten Task betroffen ist. Siehe ScheduledFutureTask.runPeriodic () auf, wie diese umgesetzt wird.

Andere Tipps

Sie können einen Blick der OpenJDK7 Implementierung von ScheduledThreadPoolExecutor.java , welche die einzige Klasse, die Umsetzung der ScheduledExecutorService Schnittstelle ist.

Doch soweit ich weiß, gibt es eine Garantie im ScheduledExecutorService über Genauigkeit. Also selbst wenn Ihr measurments diese acurate sein zeigen, die nicht der Fall sein kann, wenn Sie auf eine andere Plattform, vm oder jdk wechseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top