2016-07-11 5 views
3

Bearbeiten: Ich habe diese link verwiesen und ich bin in der Lage, den Code-Flow von InvokeLater zu verstehen. Meine Frage ist, warum wird diese Logik auf diese Weise umgesetzt? Gibt es bestimmte Gründe?Warum sollte die Methode SwingUtils.invokeAndWait() außerhalb eines EDT-Threads aufgerufen werden?


Folgende ist mein Code:

private void init() 
    { 
    JFrame jfr = new JFrame(); 
    jfr.setSize(500, 500); 
    jfr.setVisible(true); 
    jfr.setTitle("Test"); 


    JButton jb = new JButton("Ok"); 
    jfr.add(jb); 

    jb.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 
       SwingUtilities.invokeAndWait(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         System.out.println("hello"); 
        } 
       }); 
      } 
      catch (Exception e1) 
      { 
       e1.printStackTrace(); 
      } 
     } 
    }); 

erste Frage (Während InvokeAndWait verwenden):

Warum es so umgesetzt wird, dass sie eine InvocationTargetException wirft, wenn sie innerhalb EDT genannt Faden?

Zweite Frage (bei der Verwendung von InvokeLater):

Warum invokeLater dies erlaubt?

Nun, das ist mein Grundverständnis über EDT-Themen:

invokeAndWait:

  • Orte Job F in die EDT Ereignis-Warteschlange und wartet, bis die EDT sie ausgeführt hat .
  • Dieser Aufruf blockiert, bis alle ausstehenden AWT-Ereignisse (A, B, C, D, E) verarbeitet wurden und (dann) F ausführen, nach denen die Steuerung zurückkehrt.
  • Gibt zurück, wenn und nur wenn der Job abgeschlossen ist. (Control kehrt zurück, nachdem F abgeschlossen ist.)
  • Technisch ein synchroner blockierender Aufruf.

invokeLater:

  • Orte der Job F in die EDT Queue, aber wartet nicht auf seinen Abschluss (Im Grunde genommen ein Anruf veröffentlichen und zurück)..
  • Wenn uns die Jobvervollständigung nicht interessiert, können wir InvokeLater verwenden.
  • Technisch ein asynchroner nicht blockierender Aufruf.
+3

Mögliches Duplikat der [invokeAndWait Methode in SwingUtilities] (http://stackoverflow.com/questions/5499921/invokeandwait-method-in-swutilities) – Sanjeev

Antwort

3

EDT ist das gleiche wie AWT. Alle UI-Ereignisse in AWT werden in einem einzelnen Thread namens EDT geplant. Grundsätzlich wird der Thread verwendet, um UI-bezogene Ereignisse in Swing zu verarbeiten.

InvokeAndWait: Grundsätzlich rufen Sie eine Aufgabe im selben Thread auf und warten dann, bis diese Aufgabe abgeschlossen ist. Dies würde zu einem Deadlock führen. Ihre Methode wird nie zurückkehren, da Sie auf die Aufgabe warten. Die Aufgabe wird nie ausgeführt, da Ihre Methode nie abgeschlossen wird.

InvokeLate: Es funktioniert, weil Sie nicht darauf warten, dass diese Aufgabe abgeschlossen wird.Sie rufen es in genau demselben Thread auf, aber Sie warten nicht darauf, dass es abgeschlossen wird. Dies führt nicht zu einem Deadlock.

+1

Um fair zu sein, wäre es wirklich einfach, den Deadlock zu vermeiden (Sie sind bereits auf dem rechten Thread führen Sie einfach den Code direkt), aber Sie sollten im Allgemeinen wissen, ob Sie auf dem GUI-Thread sind oder nicht, so würde dies nur faule Programmierung unterstützen – Voo

+1

In der Tat können Sie dies nicht so leicht tun, wie Sie denken. Fast alle Frameworks verwenden ein einziges Rendering ** QUEUE ** aus einem bestimmten Grund. Sie haben möglicherweise tausende Aufgaben geplant, die ** vor Ihren Aufgaben ausgeführt werden müssen. Sie können zufällige Aufgaben nicht einfach an zufälligen Punkten einfügen oder ausführen, außer dass sie funktionieren. Einige Berechnungen hängen voneinander ab. Das Problem der Multithreading-Benutzeroberfläche ist sehr tief und kann zum Rendern und Debuggen von Albträumen führen. Aus diesem Grund haben einige clevere Entwickler entschieden, dass die Benutzeroberfläche in einem einzigen Thread ausgeführt werden muss und die UI-Aufgaben in einer bestimmten Reihenfolge in einer ** QUEUE ** ausgeführt werden müssen. –

+0

Gibt es tatsächlich eine Dokumentation, in der Order-Ereignisse ausgeführt werden? Nicht, dass ich davon Wüste. Win32 zum Beispiel gibt Ihnen keine solche Garantien, soweit ich weiß und in der Tat nicht wirklich * eine * Warteschlange (wenn Sie möchten, können Sie sagen, es hat zwei). Wenn keine bestimmte Reihenfolge garantiert ist, wäre dies ein vollkommen akzeptables Verhalten. – Voo