Frage

Für das, was ich lesen kann, wird verwendet, um einen neuen Thread in einer Schaukel App versenden einig „Hintergrund“ Arbeit zu verrichten, aber was ist der Nutzen aus der Verwendung diesen eher als einen „normalen“ Thread?

Ist das nicht das gleiche einen neuen Thread mit, und wenn es eine GUI-Methode beenden aufrufen mit SwingUtilities.invokeLater? ...

Was bin ich hier fehlt?

http://en.wikipedia.org/wiki/SwingWorker

http://java.sun.com/products /jfc/tsc/articles/threads/threads2.html

War es hilfreich?

Lösung

Ja, können Sie erreichen, was ein Swingworker tut mit Vanille-Fäden + invokeLater. Swingworker bietet eine vorhersehbare, integrierte Art und Weise Aufgaben auf einem Hintergrund-Thread und Bericht Ergebnis auf dem EDT zu erreichen. Swingworker fügt zusätzlich für Zwischenergebnisse unterstützen. Auch hier können Sie sich all dies tun, aber manchmal ist es einfach, vor allem die integrierte und berechenbare Lösung zu verwenden, wenn es um die Parallelität kommt.

Andere Tipps

Ein Codebeispiel:

import org.jdesktop.swingx.util.SwingWorker; // This one is from swingx
                                             // another one is built in 
                                             // since JDK 1.6 AFAIK?

public class SwingWorkerTest {

  public static void main( String[] args ) {

    /**
      * First method
      */
    new Thread() {

      public void run() {

        /** Do work that would freeze GUI here */

        final Object result = new Object();
        java.awt.EventQueue.invokeLater( new Runnable() {

          public void run() {
          /** Update GUI here */
          }
        } );

      }
    }.start();

    /**
      * Second method
      */
    new SwingWorker< Object , Object >() {

      protected Object doInBackground() throws Exception {
        /** Do work that would freeze GUI here */

        return null;
      }

      protected void done() {
        try {
          Object result = get();
          /** Update GUI here */
        }
        catch ( Exception ex ) {
          ex.printStackTrace();
          if ( ex instanceof java.lang.InterruptedException )
            return;
        }
      }
    }.execute();
  }

}

Die Wahl hängt immer von der persönlichen Präferenz und Anwendungsfall.

Die zweite Methode hat einen Vorteil, wenn Refactoring. Sie können die anonyme Klasse zu einer inneren Klasse leichter konvertieren, wenn das Verfahren ist es verwendet wird in zu groß.

Meine persönliche Präferenz geht in den zweiten, denn wir einen Rahmen gebaut haben, wo SwingWorkers hinzugefügt werden kann, und einen nach dem anderen ausgeführt ...

Swingworker ist eine Implementierung eines gemeinsamen Muster (in .net Ich lese es gibt GuiWorker Background für diese), wo Sie in einem GUI-Programm einige Arbeit zu tun haben, aber halten die GUI ansprechbar. Das Problem ist, dass oft GUI-Bibliotheken sind nicht multithread sicher, so dass der gemeinsame Weg, um solche Arbeitnehmer zu implementieren, ist die Nachrichtenschleife der Bibliothek zu verwenden, um Nachrichten in die Ereignisschleife der Anwendung zu übertragen.

Diese Klassen können Sie auf einfache Weise Ihre GUI aktualisieren. Normalerweise haben sie eine update(int status) Methode, die durch den Faden, versandt von der Klasse und behandelt durch die GUI aufgerufen wird, während der Thread seine Arbeit fortsetzt.

normale Threads verwenden, müssen Sie Ihre eigenen Veranstaltungen oder einen anderen Messaging-Mechanismus für diese Aufgabe codieren, die ein Schmerz sein können, wenn Sie diese Funktion häufig benötigen. Mit invokeLater in Java zum Beispiel, würden Sie den Code vermischen für die Aktualisierung der gui in den Code für die Arbeit zu tun. Die Swingworker ermöglicht es Ihnen, die Dinge getrennt zu halten.

Ihre Frage zu beantworten, die Sie vermissen nichts. Diese Klasse ist nur ein praktisches Dienstprogramm für die Funktionalität Einwickeln Sie discribed (einen anderen Thread beginnt die Hintergrundarbeit und dann Aufruf einige letzte Aktion auf dem EDT mit den Ergebnissen zu tun).

Wenn Sie mit Schaukel arbeitet, ist es wichtig, dass der Hauptschwenk Verarbeitung zu wissen (dh. Rendering) auf einem einzigen Thread passiert (was nicht Ihr Haupt-Thread ist). Dies ist oft der Schaukel oder AWT Event Thread aufgerufen. Diejenigen, die mit dem JDK 1.6 pre wird sich erinnern, die „grauen Rechteck“ Fehler, wenn Sie zu viel Zeit in einem Event-Dispatcher für eine Swing-Komponente ausgegeben. Was bedeutet das. In jedem Swing-Anwendung haben Sie zwei Threads laufen, dass Sie jetzt zu beschäftigen haben. Normalerweise, wenn alle Operationen innerhalb eines Event-Dispatcher (der Code, der gefeuert wird sagen, wenn eine Schaltfläche geklickt wird) kurz ist (dh., Den Zustand eines siwng Schaltfläche Ändern) Sie ihn nur innerhalb des Event-Dispatcher laufen können. Wenn Ihre Anwendung wird einen Web-Service oder eine Datenbank nennen, oder Du Anwendungszustand wird durch externe Ereignisse angetrieben (dh. Jms) oder Sie wollen einfach nur die Benutzeroberfläche interaktiv (dh machen. Eine Liste der Elemente bauen und in der Lage sein, etwas anderes tun) Sie einen anderen Thread als der aWT Event Thread verwendet werden sollen (der Hauptschwenk eins). Also in diesen Fällen Sie einen neuen Thread erzeugen und tun, was Sie haben, und wenn die Ergebnisse schließlich zurückkommen, müssen Sie dann irgendwie ein Ereignis, das von der AWT / Swing Dispatcher ausgeführt werden kann. Swingworker ist ein großes kleines Design-Muster, das Sie tun, um dies zu tun erlaubt (die andere Art und Weise ist SwingUtilities). Es ist besonders nützlich für die Daten aus externen Quellen oder sagen lange Berechnungen (Rendern eine Grafikszene) holen zu tun. Es hilft, den Versand und die anschließende erneute Integration der Ergebnisse von einem Außengewinde (andere als die AWT-Gewinde) zu automatisieren. Für Asynchron-Ereignisse (zB. Ein Ereignis von JMS muss ein Ergebnis aktualisieren, verwenden SwingUtilities).

SwingWorker macht triviales Beispiel Code viel prägnanter. Allerdings schafft es eine Kugel aus Schlamm. Kommunikation zu und von der GUI und ausgeführt Logik sind alle miteinander verschweißt. Also, würde ich nicht wie es in echten Produktionscode verwendet, um zu sehen.

Swingworker sind viel leichter als mit Ihren eigenen Threads Ausmisten, weil es zwei Dinge gibt, die schmerzhaft sind manuell, Faden Koordination zwischen der Benutzeroberfläche und dem Hintergrundprozess und tun Schleifen wirksam, Hintergrundarbeit, das Updates zu arbeiten und zu senden an das hält zurück inkrementell UI, eine große Menge von Daten, wie Prozess oder eine große Liste lädt. Der Nachteil (oder Vorteil) hängt davon ab, wie man es betrachtet, ist, dass es die zugrunde liegende Implementierung versteckt, so dass zukünftige Version unterschiedliches Verhalten haben kann, Leistung, usw., was unerwünscht sein kann. Ich finde mich es sehr nützlich als Klebstoff zwischen einem UI-Ereignisse und meinem eigenen Befehlscode, der Swingworker hält den Link auf die UI und mein Code Pumpe Daten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top