Threads asynchrone Tätigkeit mit Ergebnis Auswertung

redbomber

Bekanntes Mitglied
Hallo zusammen,
ich stehe gerade vor folgendem Problem:

Über die GUI kann der Anwender verschiedene Aktionen durchführen. Diese dauern etwas länger und laufen in einem extra Thread asynchron ab.

Jetzt möchte ich aber an Ergebnisse in diesem Thread dran kommen.
Wie ich gelesen habe gibt es hierfür zwei Möglichkeiten:
Über Callback oder das Future-Pattern.

Ich möchte das Future-Pattern anwenden, wo ich mit der methode get() and das Ergebnis komme:

Java:
FutureTask<Integer> t = new FutureTask<Integer>(new HelloWorldCount()); // 1
new Thread(t).start(); // 2
int result = t.get());

Schön und gut, aber wenn ich über FutureTask.get() an das Ergebnis will, warte ich doch automatisch bis das Ergebnis da ist. Dann blockiere ich wieder meinen aufrufenden Thread. In meinem Fall die GUI, was ich ja gerade nicht will.

Also ich habe Beispiele dazu angeschaut, aber kein einziges Beispiel gefunden, wo mein Problem beschrieben ist. Oder verstehe ich hier einfach nur etwas falsch?
 

Marco13

Top Contributor
Nichts falsch verstanden. Auf so ein Feature könnte dann in einem anderen Thread gewartet werden. Für GUI-Sachen würde sich eher ein Callback anbieten. Kannst dir mal den SwingWorker ansehen: Der ist für sowas gedacht, und hat z.B. so eine Callback-Methode "done()", die automatisch im EDT aufgerufen wird, wenn er fertig ist. Der SwingWorker könnte auch so gestaltet werden, dass seine einzige Arbeit daraus besteht, auf eine Future zu warten...
 

Bernd Hohmann

Top Contributor
.isDone() von FutureTask könnte helfen - was letztendlich auf die Variante von kaetzacoatl hinausläuft (mit dem Vorteil, dass man im eigenen Code sieht was passiert). Die Java-Runtime ist mittlerweile mit soviel "eleganten" Krücken-Routinen behaftet dass ich kotzen könnte.

Beispiel für FutureTask was Deinem Problem nahekommt: FutureTask - Programming Examples

Bernd
 

redbomber

Bekanntes Mitglied
super vielen Dank schonmal euch allen!

Dann will ich nochmal (hoffentlich richtig) zusammenfassen:

Future-Pattern:
Ich muss also in jedem Fall mit einer Schleife auf das Ergebnis des ausführenden Threads
warten, so wie in dem Beispiel von Bernd Hohmann
Bsp.:
Java:
	 FutureTask<String> future = new FutureTask<String>(...);
	 executor.execute(future);

	 while (!future.isDone()){
		try{
			//wait
			Thread.sleep(500);
		} catch (InterruptedException ie){
		}
	}
@kaetzacoatl
Dein Beispiel ist ja im Grunde gleich wie beim Future Pattern

Wenn also mein ausführender Thread von der GUI aus aufgerufen wird, dann ist das Future- Pattern
nicht sinnvoll, da dies zum einfrieren der GUI führt.

Callable-Pattern:
Dieses funktioniert im wesentlichen über Listener. D.h. der arbeitenden Thread informiert den aufrufenden
über ein entsprechendes Event. Dies Variante wollte ich gerade wählen, da dies eben meine GUI nicht einfriert.
Aber @Marco13, dein Beispiel mit dem SwingWorker, ist sehr gut, da die Methode done() vom SwingWorker nach beenden der Aufgabe
ausgeführt wird. Also dann muss ich den aufrufenden GUI-Thread nich mal als Listenern registrieren. Das macht alles der SwingWorker für mich und die Änderungen bei mir sind minimal.


Also ich habe es noch nicht probiert, aber ich sehe mit dem SwingWorker gerade kein Problem und denke es wird einfach den bei mir einzubinden.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Wie löst ihr asynchrone Datenermittlung? Allgemeine Java-Themen 8
D asynchrone "Container" Allgemeine Java-Themen 5
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
N Wie kommt dieses Ergebnis zu stande Allgemeine Java-Themen 15
Y Falsches Ergebnis mit "/" Operator Allgemeine Java-Themen 2
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
M Falsches Ergebnis bei Rechnung Allgemeine Java-Themen 1
T If Vergleich ergibt nicht das richtige Ergebnis Allgemeine Java-Themen 2
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
Chr1s ergebnis = Zahl? Allgemeine Java-Themen 3
D Timestamp to Date, ergibt falsches ergebnis Allgemeine Java-Themen 5
Antoras Micro-benchmark für parallel vs. sequentiell erzeugt unerwartetes Ergebnis Allgemeine Java-Themen 8
S Ergebnis von Cursor c1 mit Cursor c2 vergleichen Allgemeine Java-Themen 3
M 2 Methoden, 2 Rückgabewerte, aber ein Ergebnis Allgemeine Java-Themen 7
N contains(.) liefert nicht erwartetes Ergebnis Allgemeine Java-Themen 3
M richtiges Ergebnis zählen und übergeben? Allgemeine Java-Themen 7
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben