2012-05-25 8 views
6

que estaba haciendo un poco de lectura a través de los tutoriales de Sun Java, y me encontré con esta página aquí:¿Qué significa esta llamada al método java .execute()?

How to Make an Applet

Bajo el título, "Temas en applets" yo encontramos este trozo de código:

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

Primero soy nuevo, así que lo siento si esta es una pregunta estúpida. Sin embargo, nunca he oído hablar de eso ".excecute()". No lo entiendo, y no puedo encontrar nada al respecto desde google. Veo que esto es ... ¿una clase interna anónima? (Corrígeme) y está comenzando un hilo para cargar imágenes. Pensé que el método run() se invoca con una llamada a start()? Por favor, ayúdame a aclarar esta confusión.

+1

Aquí está el 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/ –

Respuesta

7

execute es un método de SwingWorker. Lo que está viendo es que se está creando una instancia de anonymous class y se llama inmediatamente al método execute.

Tengo que admitir que estoy un poco sorprendido de que compila el código, sin embargo, ya que parece ser el resultado de la asignación a la variable executeworker, y la documentación nos dice que es una función executevoid.

Si deconstruimos ese código un poco, puede ser más claro. En primer lugar, creamos una clase anónima que se extiende SwingWorker y creamos una instancia del mismo, todo al mismo tiempo (esto es la gran bits entre paréntesis):

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 
    } 

}; 

entonces llamamos execute y asignar el resultado a worker (que es la parte que, me parece, no debe compilar):

SwingWorker worker = tmp.execute(); 

actualización: y de hecho, lo probé y doesn't compile. Entonces no es un gran código de ejemplo. Esto compilar:

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 veo, ¿no es una instancia de Thread? Bueno, me siento tonto ahora. – yoonsi

+0

@yoonsi: No es necesario sentirse tonto, las clases anónimas son complicadas. 'SwingWorker' está * relacionado * con los hilos, ya que pone en cola el trabajo para que ocurra en una sola hebra de fondo administrada por Swing. –

1

El .execute() está llamando el método ejecutar en una instancia de una clase anónima; es decir, el objeto creado por new SwingWorker<ImageIcon[], Object>(){...}. (Es una clase que amplía la clase SwingWorker).

De acuerdo con javadoc, el método execute programa la tarea representada por la instancia que se ejecutará en una cadena de trabajo existente. El ciclo de vida de la cadena de trabajo (por ejemplo, creación, inicio, etcétera) está a cargo de la infraestructura de Swing.

Cuestiones relacionadas