2010-05-13 10 views
9

SwingWorker für die folgenden Zwecke verwendet wird:Java - Unterschied zwischen Swingworker und SwingUtilities.invokeLater()

  • Für in einem anderen Thread lang laufende Aufgaben ausgeführt, um die GUI aus nicht reagiert
  • zu verhindern, Zum Aktualisieren der GUI mit den Ergebnissen, die von der lang andauernden Aufgabe am Ende der Aufgabe über die Methode done() erzeugt wurden.
  • Für die Aktualisierung der GUI von Zeit zu Zeit mit den Zwischenergebnisse produziert und veröffentlicht von der Aufgabe mit Hilfe von publish() und process() Methoden.

SwingUtilities.invokeLater() können die oben genannten Aufgaben erfüllen, wie folgt:

  • Statt SwingWorker.execute() Methode aus der EDT des Ausführens wir ExecutorService.submit(new MyRunnable()) ausführen kann, da es auch einen anderen Thread erzeugen, die lang laufende Aufgabe ausführen kann.
  • Für die Aktualisierung der GUI am Ende der Aufgabe können wir den Code (geschrieben in done() Methode von case1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) am Ende der Aufgabe setzen.
  • Für die Aktualisierung der GUI in der Mitte der Aufgabe, können wir Code (geschrieben in process() Methode von case1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) an der Stelle, wo wir publish() Methode in case1 aufgerufen.

ich diese Frage bin zu fragen, weil das Problem in Frage angegeben Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT von SwingUtilities.invokeLater() gelöst werden kann, aber nicht mit SwingWorker

+1

Ich bin nicht ganz sicher, was die 'Frage' ist. – akf

+0

@akf wenn Sie nicht sicher sind, dann lassen Sie es. Simple :) –

+0

Das Problem, auf das Sie verweisen, ist mit SwingWorker lösbar. Siehe meine Antwort dort. –

Antwort

6

SwingWorker gelöst werden ist eine Hilfsklasse - es ist nicht, dass Sie muss es verwenden, aber es ist viel einfacher und klarer als die gleiche Arbeit von Hand zu tun. (Es erleichtert auch die Überprüfung des Fortschritts.) Beachten Sie, dass Version 6 hinzugefügt wurde - vorher verwendeten einige Leute eine einfachere Klasse, die im Swing-Tutorial definiert wurde, oder waren ähnlich wie die von Ihnen notierten.

+0

+1 Praktisch gibt es einen Quellkompatiblen Back-Port für Java 5. https://swingworker.dev.java.net/ – trashgod

1

Ein wichtiges Feature der Klasse 1,6 + SwingWorker ist die EDT (Event Dispatch Thread) -Differenz zwischen doInBackground() und done(). Sie sollten sich doInBackground() als doWorkOutsideEDT() und done() als doWorkInsideEDT() vorstellen. Führen Sie dieses Beispiel aus, um die Unterschiede zu sehen.

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

Ausgang:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here. 
Verwandte Themen