Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern?

Status
Nicht offen für weitere Antworten.

jherz

Mitglied
Hallo,

mein Programm soll eine Swing-Oberfläche haben über die der User mittels Aktionen in Menüs, Buttons, Listen usw. Befehle übers Netzwerk verschicken kann.
Die Sache ist jetzt die, dass ich zwar Multithreading insofern benutzen möchte dass das GUI nicht blockiert, d.h. die ganze Netzwerkgeschichte nicht im EDT möchte. Andererseits ist das Netzwerkprotokol synchron und ich muß daher verhindern das Befehl2 verschickt wird bevor die Antwort auf Befehl1 da ist.

Dazu sehe ich zwei Möglichkeiten.
1. Die GUI während wartens auf Antwort so zu beschränken (z.B. Elemente disablen) dass währenddessen nichts ausgelöst werden kann.
2. Alle Befehle die ausgelöst werden, landen in einer Queue und werden nacheinander ausgeführt.

Momentan (mit Disziplin bei der Bedienung) wird für jeden Befehl ein SwingWorker kreiert und in dessen doInBackground() ausgeführt, die Antwort wird im done() der GUI bekanntgegeben. Aber SwingWorker schert sich halt nicht um o.g. Beschränkung und der User könnte mehrere gleichzeitig auf den Weg bringen.

Jetzt meine Fragen: Gibt es noch weitere Konzepte um zu erreichen was ich möchte? Wie löst ihr sowas?
Momentan gefällt mir obige Idee 2 besser als die erste. SwingWorkers Verhalten lässt sich leider nicht modifizieren (getWorkersExecutorService() ist private). Kennt ihr ähnliche Klassen die sich modifizieren lassen oder schon das gewünschte Verhalten aufweisen?
Übersehe ich etwas?

Jürgen
 
SwingWorker ist eine Runnable. Du könntest versuchen, mit einem ThreadPoolExecuter der Größe 1 zu arbeiten und die Worker dort nacheinander zu submitten.
 
SwingWorker ist eine Runnable. Du könntest versuchen, mit einem ThreadPoolExecuter der Größe 1 zu arbeiten und die Worker dort nacheinander zu submitten.
Stimmt, dass es das Interface bietet hatte ich übersehen.
In einer Klasse verpackt damit das Interface beschränkt werden kann (zumindest SwingWorkers execute() ist mir sonst zu gefährlich) könnte das gehen. Ich werd's mal versuchen, allerdings mit Executors.newSingleThreadExecutor().

Jürgen
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben