wake-up-neo.net

Was macht SwingUtilities.invokeLater?

Was macht SwingUtilities.invokeLater tun? Verzögert es nur die Ausführung eines Codeblocks innerhalb seiner run -Methode? Was ist der Unterschied zwischen dem Aufruf einer Aktion innerhalb der Funktion invokeLater oder dem einfachen Aufruf am Ende des Threads, den wir ausführen möchten? Kann mir jemand helfen, was die Funktion invokeLater wirklich bewirkt?

37
user633784

Wie andere Antworten bereits sagten, führt es Ihr Runnable im AWT-Ereignis-Dispatching-Thread aus. Aber warum willst du das tun? Da die Swing-Datenstrukturen nicht threadsicher sind, haben die Swing-Designer die Regel festgelegt, dass der gesamte Code, der auf sie zugreift, auf demselben Thread ausgeführt werden muss, damit Programmierer nicht gleichzeitig auf sie zugreifen können. Dies geschieht automatisch für die Ereignisbehandlung und die Anzeige des Wartungscodes. Wenn Sie jedoch eine lang andauernde Aktion gestartet haben - natürlich für einen neuen Thread -, wie können Sie den Fortschritt oder den Abschluss dieser Aktion signalisieren? Sie müssen ein Swing-Steuerelement ändern und Sie müssen es aus dem Ereignis-Dispatching-Thread ausführen. Daher invokeLater.

27

Der Code wird auf dem AWT-Thread ausgeführt. Hiermit können Sie die GUI von anderen Threads aus ändern.

Von Text & Tabellen :

Bewirkt, dass doRun.run () im AWT-Ereignis-Dispatching-Thread asynchron ausgeführt wird. Dies geschieht, nachdem alle anstehenden AWT-Ereignisse verarbeitet wurden. Diese Methode sollte verwendet werden, wenn ein Anwendungsthread die GUI aktualisieren muss.

9
MByD

Wie bereits erwähnt, können Sie mit InvokeLater Methoden in Swing-Klassen sicher aufrufen, wenn Sie zunächst nicht in EventQueue ausgeführt werden. Sie können jedoch Ihren Code und Ihr Leben vereinfachen, indem Sie in der EventQueue auf andere Felder und Klassen zugreifen nur. Sie können mit Swing und untereinander arbeiten, ohne den ganzen Aufwand von Multithreading. Wenn Sie einen anderen Thread gestartet haben, verwenden Sie InvokeLater, um so schnell wie möglich zur EventQueue zurückzukehren und die Anzahl der zu synchronisierenden oder anderweitig zu schützenden Felder zu minimieren.

Wenn Sie das Beste aus mehreren Kernen machen möchten, müssen Sie die Verwendung von EventQueue reduzieren und einen hohen Preis für die Komplexität zahlen.

2
RalphChapin

das wäre ein Kommentar, sieht aber so lang aus wie ..., nur einfaches Zeug

1/Erstellen Sie einen eigenen EDT für die korrekte Aktualisierung der GUI, z. Wenn Sie Code ausführen, indem Sie einfaches Vanilla Thread , Java.util.Timer , Executor .. more here verwenden =

2/hilft beim Setzen von Focus auf JComponents davon gibt es einige Listener denn wenn da f.e. DocumentListener dann können Sie Focus nur schwer auf den gewünschten JComponents einstellen

3/Delay-Code-Ausführungen blockieren und an das Ende von EDT verschieben

2
mKorbel

Beachten Sie, dass Sie schließlich für jedes Mal, wenn Sie invokeLater (doRun) aufrufen, einen Aufruf Ihrer doRun.run () -Methode erhalten. Wenn Sie es also zehnmal aufrufen, bevor der Ereignisthread die Möglichkeit hat, seine Verarbeitung durchzuführen, werden Sie wahrscheinlich zehn aufeinanderfolgende Aufrufe von doRun.run () erhalten.

1
gerardw