2009-02-14 7 views
6

Wie würde man einen Echtzeit-Thread mit einem normalen Thread in Java synchronisieren? Nehmen Sie zum Beispiel einen Echtzeit-Thread, der einige Temperaturen berechnet, und den GUI-Thread, der diese Zahlen sammeln und auf einigen Steuerelementen anzeigen muss.Echtzeit-Thread-Synchronisation mit normalen Threads

Die Implementierung der Echtzeitbibliothek sollte keine Rolle spielen, da sie den Spezifikationen entsprechen sollte.

Antwort

4

Sie werden zwei Dinge brauchen. Sie möchten, dass Ihr Echtzeit-Thread Priorität erhält und vorzugsweise durch einen Timer gesteuert wird, so dass Sie (fast) regelmäßige Messungen erhalten. Dann werden Sie eine Ressource wollen, die verwendet werden kann, um die Werte zu kommunizieren. Das kann entweder ein einfacher Monitor sein, mit einem kritischen Abschnitt, so dass der Timer-Thread in ihn schreiben kann, oder er könnte - und wahrscheinlich ist es besser - ein FIFO sein, so dass der GUI-Thread immer Werte auffressen kann hat Zyklen.

In Java läuft auf der GUI (zumindest in Swing und ähnlichem) bereits ein separater Thread für UI-Interaktionen. Sie müssen also Ihren Mess-Thread einrichten. Werfen Sie einen Blick auf Runnables.

2

Um Echtzeit-Threads verwenden zu können, benötigen Sie Real Time Java auf einem Echtzeit-Betriebssystem. http://java.sun.com/javase/technologies/realtime/index.jsp

Wenn Sie jedoch einen Thread haben, der latenzempfindlich ist, empfehle ich Ihnen;

  • Verwenden Sie die Concurrency-Bibliotheken in der Kommunikation mit anderen Threads.
  • jede GC Aktivität minimieren (va voll GCs)
  • den Faden nicht in demselben Prozess als GUI ausführen, wenn Sie können
  • (wie es eine Menge von Ressourcen in einer Weise, neigt dazu, greifen Sie die Kontrolle über nur über begrenzte)
2

Da andere RTSJ haben, werde ich kommentieren, dass die Synchronisation zwischen Echtzeit-und Nicht-Echtzeit-Code eine Reihe von Lösungen hat. RTSJ stellt wait-free queues für eine solche Kommunikation bereit. Es ist auch möglich, auf diesen oder anderen Warteschlangen aufzubauen und RTSJs AsyncEvent und AsyncEventHandler Abstraktionen zu verwenden, um die Kommunikation zu verwalten. Dies ist für Situationen geeignet, in denen Sie wirklich, wirklich, ein deterministisches Verhalten für den "Echtzeit" -Thread benötigen.

Wenn Sie Best-Effort-Verhalten akzeptieren können (versuchen Sie wirklich, Ihre Deadlines zu erreichen, aber die Welt fällt nicht auseinander, wenn Sie vermissen) Ich schlage vor, das Executor-Framework von the Java concurrency utilities sorgfältig zu erstellen. Eine sorgfältige Auswahl der Aufgabengrenzen, eine geeignete Warteschlangenrichtlinie (hier "geeignet" würde von mehr Details über Ihre Anwendung abhängen als Sie angegeben haben), und die Threadpool-Richtlinie erhält, was Sie brauchen.