2012-05-25 20 views
6

stavo facendo qualche lettura attraverso le esercitazioni sole java, e mi sono imbattuto in questa pagina qui:Che cosa significa questa chiamata al metodo java .execute()?

How to Make an Applet

Sotto il titolo, "Discussioni nel applet" ho trovato questo pezzo di codice:

//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(); 
} 

primo up sono piuttosto nuovo, quindi mi dispiace se questa è una domanda stupida. Comunque non ne ho mai sentito parlare di ".excecute()". Non lo capisco e non riesco a trovare nulla a riguardo da Google. Vedo che questo è ... una classe interiore anonima? (Si prega di correggermi) e sta avviando una discussione per caricare le immagini. Ho pensato che il metodo run() sia invocato con una chiamata a start()? Per favore aiutami a chiarire questa confusione.

+1

Ecco il 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/ –

risposta

7

execute è un metodo di SwingWorker. Quello che stai vedendo c'è un anonymous class essere istanziato e avendo il suo metodo execute chiamato immediatamente.

devo ammettere che sono un po 'sorpreso che il codice compila, però, perché sembra essere assegnare il risultato di execute alla variabile worker, e la documentazione ci dice che execute è una funzione void.

Se decostruiamo quel codice un po ', può essere più chiaro. In primo luogo, creiamo una classe anonima che si estende SwingWorker e creare un'istanza di esso, tutto allo stesso tempo (questo è il grande bit tra parentesi):

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 
    } 

}; 

Poi chiamiamo execute e assegnare il risultato a worker (che è il bit che, mi sembra, non devono compilare):

SwingWorker worker = tmp.execute(); 

Aggiornamento: e in effetti, ho provato e doesn't compile. Quindi non ottimo codice di esempio. Ciò compilazione:

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 vedo quindi non è un caso di Discussione? Bene, mi sento stupido ora. – yoonsi

+0

@yoonsi: Non c'è bisogno di sentirsi stupida, classi anonime sono ingannevoli. 'SwingWorker' è * correlato * ai thread, nel senso che accoda il lavoro in un singolo thread in background gestito da Swing. –

1

Il .execute() sta chiamando il metodo Execute su un'istanza di una classe anonima; vale a dire l'oggetto creato da new SwingWorker<ImageIcon[], Object>(){...}. (È una classe che estende la classe SwingWorker.)

In base a javadoc, il metodo execute pianifica l'attività rappresentata dall'istanza da eseguire su un thread di lavoro esistente. Il ciclo di vita del thread di lavoro (ad es. Creazione, avvio, ecc.) È gestito dall'infrastruttura di Swing.

Problemi correlati