2010-05-13 20 views
9

SwingWorker se utiliza para los siguientes propósitos:Java - Diferencia entre SwingWorker y SwingUtilities.invokeLater()

  • Para la ejecución de tareas de larga ejecución en un hilo diferente, así como para evitar que la interfaz gráfica de usuario de ser insensible
  • Para actualizar la GUI con los resultados producidos por la tarea de larga ejecución al final de la tarea mediante el método done().
  • Para actualizar la GUI de vez en cuando con los resultados intermedios producidos y publicados por la tarea con la ayuda de los métodos publish() y process().

SwingUtilities.invokeLater() puede realizar las tareas anteriores de la siguiente manera:

  • En lugar de ejecutar SwingWorker.execute() método de la EDT, podemos ejecutar ExecutorService.submit(new MyRunnable()) ya que también va a crear otro hilo que puede ejecutar tarea de larga duración.
  • Para actualizar la GUI al final de la tarea, podemos poner el código (escrito en el método done() de case1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) al final de la tarea.
  • Para actualizar la GUI en el medio de la tarea, podemos poner el código (escrito en el método process() de case1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) en el lugar donde llamamos al método publish() en caso1.

estoy haciendo esta pregunta porque el problema determinada en cuestión Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT puede ser resuelto por SwingUtilities.invokeLater() pero no se puede resolver con SwingWorker

+1

no estoy muy seguro de lo que es el 'asunto'. – akf

+0

@akf si no está seguro, entonces déjelo. Simple :) –

+0

El problema al que se refiere es solucionable mediante el uso de SwingWorker. Ver mi respuesta allí. –

Respuesta

6

SwingWorker es una clase de ayuda - no es que se Necesito usarlo, pero usarlo es mucho más simple y claro que hacer el mismo trabajo a mano. (También hace que sea más fácil verificar el progreso.) Tenga en cuenta que se agregó la versión 6: antes, algunas personas usaban una clase más simple definida en el Tutorial de Swing o realizaban un paso similar al que anotaban.

+0

+1 Convenientemente, hay un puerto posterior compatible con la fuente para Java 5. https://swingworker.dev.java.net/ – trashgod

1

Una característica importante de la clase 1.6+ SwingWorker es la diferencia EDT (Event Dispatch Thread) entre doInBackground() y done(). Debería pensar en doInBackground() como doWorkOutsideEDT() y done() como doWorkInsideEDT(). Ejecute este ejemplo de instrucción para ver lo diferente.

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

Salida:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here. 
Cuestiones relacionadas