Swing Fragen bezüglich Multithreaded GUIs (Grundlagen):

Ulathar

Aktives Mitglied
Hallo,

ich werkel schon länger mit Java und insbesondere mit Java GUIs auf Swing Basis rum und wollte nun mal "meinen Horizont erweitern" und mich mit Threads beschäftigen (war bis dato nie notwendig).

Bis jetzt habe ich maximal mit Swing Workern gearbeitet und versuche gerade folgendes zu realisieren:

Ich würde gerne in meiner Main-Methode diverse Threads starten, darunter einen "logger" Thread der in verschiedene Dateien diverse debugging informationen speichert. Und natürlich das GUI.

Bis jetzt habe ich GUIs immer mittels SwingUtilites.invokeLater gestartet, allerdings ist damit die Main-Methode abgeschlossen.

Mein bisheriger workaround war mittels while(true) schleife und nem Thread.sleep(1000) in 1 sekunden intervallen zu prüfen ob das GUI noch aktiv ist oder nicht.
Dies erscheint mir irgendwie als kontraproduktiv.


Meine Frage daher lautet:

Wie genau bekomme ich es hin, dass ich in meiner Main-Methode mehrere Threads starte, diese so lange ideln (also auch keine CPU Last erzeugen) bis ich diesen aus dem GUI heraus z.b. per Knopfdruck eine neue Aufgabe "schicke" und dass sich diese Threads terminieren, sobald das GUI beendet wird.

Was genau ich machen will:

- So lang das GUI läuft sollen 2 Threads im Hintergrund Sensordaten auslesen/erfassen
- So lang das GUI läuft soll 1 Thread im Hintergrund "ideln" und nur on demand aktiv werden um z.b. debugging informationen in ein Logfile zu schreiben
- Einer der 2 "Sensordatenthreads" soll auf "Befehle" aus dem GUI reagieren, also z.b. bestimmte Dinge berechnen wenn ich im GUI den entsprechenden Button klicke
- Wenn das GUI beendet wird (sowohl über nen Exit button, als auch über die DefaultCloseOperation funktion) sollen auch alle threads terminieren


Bin für jeden Tipp dankbar, da ich bis dato nie wirklich mit Threads gearbeitet habe (ich weiß im prinzip nur wie man welche erzeugt und startet 🙂).
 
Threads starten kannst du (fast) so viele wie du willst, wo du willst, mit Thread.sleep() verbrauchen sie kaum CPU-Zeit,
und wenn die Zeit gekommen ist, sie zu beenden, etwa in einem WindowListener, dann beendest du diese Threads eben,
setzt irgendein flag auf true, führst optional interrupt() aus, und die Threads berücksichtigen das flag beim nächsten Schleifendurchlauf,

speziell bei GUIs gibts da kaum was besonderes, du musst natürlich organisieren, wo die Thread-Objekte abgelegt sind, wer wen kennt,

Thread, sleep, flag, interrupt sind die Grundbausteine, je nach eigenen Bemühungen hin zu gemeinsamen Klassen oder Suche in der API gibts natürlich auch schönere Umsetzungen, Timer, SwingWorker usw.
 
Zuletzt bearbeitet von einem Moderator:
Für den Thread der im Hintergrund idlen soll und auf daten für ein logfile wartet würde sich eine Blockingqueue anbieten, dann machst du queue.take() und der thread wird solange angehalten, bis jemand was in die queue tut, oder der thread interrupted wird.

Beim beenden der GUI kannst du dann entweder System.exit aufrufen (eher unschön, der logger kann z.B. mitten in der arbeit unterbrochen werden), oder du rufst bei allen anderen threads thread.interrupt(); auf und danach thread.join() auf.
Wichtig ist nur das die anderen threads auch auf interrupt in absehbarer zeit reagieren (durch isInterrupted() oder durch blockende operationen wie queue.take(), die InterruptedException werfen).
 
Zuletzt bearbeitet:
Setz die Threads als Daemon Threads, damit werden sie automatisch beendet wenn alle anderen non-daemon Threads beendet sind.
Für die Aufgabe die du beschreibst eignet sich zB eine BlockingQueue.
 

Zurück
Oben