Wie übertrage ich Ergebnisse von EDT zurück zu einem anderen Thread?

8

Ich habe den folgenden Anwendungsfall:

Ich habe Code in Thread A (nicht EDT) ausgeführt. Dann möchte ich dem Benutzer eine Frage stellen, aber das muss auf dem EDT geschehen, da es Swing-Code beinhaltet (Öffnen eines Dialogs usw.). Schließlich möchte ich die Antwort des Benutzers zurück an Thread A übergeben, damit es fortgesetzt werden kann.

Ich habe Mühe, eine gute Möglichkeit zu finden, die Antwort des Benutzers an Thread A zurückzugeben. Wie machst du das?

    
Eric Lindauer 20.11.2012, 03:38
quelle

5 Antworten

16
%Vor%     
jtahlborn 20.11.2012, 03:49
quelle
2

In Thread A können Sie SwingUtilities.invokeAndWait (Runnable) verwenden, um Ihre Benutzereingabeaufforderung auf dem EDT auszuführen. Dies wird Thread A blockieren, bis Ihre ausführbare Datei abgeschlossen ist (d. H. Bis der Benutzer ein Ergebnis übermittelt und Sie ihn irgendwo gespeichert haben). Ihre ausführbare Datei kann so geschrieben werden, dass das Ergebnis irgendwo gespeichert wird, dass Thread A darauf zugreifen kann, sobald Thread A wieder die Kontrolle erlangt.

    
JimN 20.11.2012 03:46
quelle
2

Grundsätzlich müssen Sie EventQueue#invokeAndWait (AKA SwingUtilities#invokeAndWait ) verwenden. Dies wird den aktuellen Thread blockieren, bis die run-Methode zurückkehrt.

Der eigentliche Trick ist, es einzurichten, damit Sie den Rückgabewert erhalten;)

%Vor%

In diesem Beispiel erstelle ich im Grunde ein eigenes Abfrageobjekt, die implements Runnable und kann die Antwort vom Benutzer speichern

    
MadProgrammer 20.11.2012 03:47
quelle
1

Ich schrieb die folgende Bequemlichkeitsmethode, um jtahlborns Antwort hinzuzufügen. Es fügt eine Prüfung hinzu, um zu vermeiden, den EDT zu blockieren, und stellt eine nette gestraffte Ausnahmebehandlung zur Verfügung:

%Vor%

Sie nennen es so, und müssen sich keine Sorgen machen, ob Sie gerade auf dem EDT ausführen oder nicht:

%Vor%     
Eric Lindauer 20.11.2012 06:26
quelle
0

Diese util -Methode macht, was im Lieferanten in einem separaten Swing-Thread ist, und wartet bis zur Antwort. Es wird auch eine Ausnahme ausgelöst, wenn Folgendes vorhanden ist:

%Vor%

Und hier zwei Tests, damit Sie sehen können, wie man es benutzt:

%Vor%

Es gibt noch Raum, es zu verbessern, um es allgemeiner zu machen, weil diese Implementierung in SwingUtilities weiterleitet und manchmal ThreadExecutor verwendet werden soll.

    
ravenskater 28.01.2018 10:01
quelle