2012-05-25 8 views
6

Ich war etwas zu lesen über die Sun Java-Tutorials zu tun, und ich kam hier auf dieser Seite:Was bedeutet dieser Java .execute() Methodenaufruf?

How to Make an Applet

Unter der Überschrift, "Threads in Applets" fand ich dieses Stück Code:

//Background task for loading images. 
    SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() { 
      public ImageIcon[] doInBackground() { 
       final ImageIcon[] innerImgs = new ImageIcon[nimgs]; 
      ...//Load all the images... 
      return imgs; 
     } 
     public void done() { 
      //Remove the "Loading images" label. 
      animator.removeAll(); 
      loopslot = -1; 
      try { 
       imgs = get(); 
      } ...//Handle possible exceptions 
     } 

    }).execute(); 
} 

Zuerst bin ich neulich, so tut es mir leid, wenn das eine dumme Frage ist. Allerdings habe ich noch nie davon gehört ".excecute()". Ich verstehe es nicht, und ich kann nichts über Google finden. Ich sehe das hier ist ... eine anonyme innere Klasse? (Bitte korrigieren Sie mich) und es beginnt ein Thread, um Bilder zu laden. Ich dachte, dass die run() -Methode mit einem Aufruf von start() aufgerufen wird? Bitte helfen Sie mir, diese Verwirrung zu beseitigen.

+1

Hier ist das Tutorial: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html –

+0

http://docs.oracle.com/javase/6/docs/api/javax/swing /SwingWorker.html; http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ –

Antwort

7

execute ist eine Methode von SwingWorker. Was Sie dort sehen, ist ein anonymous class instanziiert und seine execute Methode aufgerufen sofort.

Ich muss zugeben, ich bin ein bisschen, dass Code kompiliert überrascht, obwohl, weil es die Zuweisung des Ergebnisses der execute auf die worker Variable zu sein scheint, und die Dokumentation sagt uns, dass execute eine void Funktion ist.

Wenn wir diesen Code ein wenig dekonstruieren, kann es klarer sein. Erstens haben wir eine anonyme Klasse erstellen SwingWorker erstreckt und eine Instanz davon erstellen, die alle zur gleichen Zeit (das ist die große Bit in Klammern):

SwingWorker tmp = new SwingWorker<ImageIcon[], Object>() { 
    public ImageIcon[] doInBackground() { 
      final ImageIcon[] innerImgs = new ImageIcon[nimgs]; 
     ...//Load all the images... 
     return imgs; 
    } 
    public void done() { 
     //Remove the "Loading images" label. 
     animator.removeAll(); 
     loopslot = -1; 
     try { 
      imgs = get(); 
     } ...//Handle possible exceptions 
    } 

}; 

Dann rufen wir execute und weisen Sie das Ergebnis worker (die das Bit, das, so scheint es mir, kompilieren sollte nicht):

SwingWorker worker = tmp.execute(); 

aktualisieren: und in der Tat, ich versuchte es und es doesn't compile. Also kein toller Beispielcode. Dies würde kompilieren:

SwingWorker worker = new SwingWorker<ImageIcon[], Object>() { 
    public ImageIcon[] doInBackground() { 
      final ImageIcon[] innerImgs = new ImageIcon[nimgs]; 
     ...//Load all the images... 
     return imgs; 
    } 
    public void done() { 
     //Remove the "Loading images" label. 
     animator.removeAll(); 
     loopslot = -1; 
     try { 
      imgs = get(); 
     } ...//Handle possible exceptions 
    } 

}; 
worker.execute(); 
+0

Oh, ich sehe also, es ist keine Instanz von Thread? Nun, ich fühle mich jetzt albern. – yoonsi

+0

@yoonsi: Keine Notwendigkeit, sich dumm zu fühlen, anonyme Klassen sind schwierig. 'SwingWorker' ist mit Threads * verbunden *, da es die Arbeit in einem einzelnen Hintergrund-Thread, der von Swing verwaltet wird, in eine Warteschlange stellt. –

1

Die .execute() wird das Verfahren auf einer Instanz einer anonymen Klasse ausführen Aufruf; d.h. das von new SwingWorker<ImageIcon[], Object>(){...} erzeugte Objekt. (Es ist eine Klasse, die die Klasse SwingWorker erweitert.)

Gemäß dem Javadoc plant die execute-Methode die Aufgabe, die von der Instanz dargestellt wird, die auf einem vorhandenen Worker-Thread ausgeführt werden soll. Der Lebenszyklus des Worker-Threads (z. B. Erstellung, Start usw.) wird von der Swing-Infrastruktur übernommen.