2010-05-13 8 views
9

SwingWorker est utilisé aux fins suivantes:Java - Différence entre SwingWorker et SwingUtilities.invokeLater()

  • Pour l'exécution des tâches en cours d'exécution à long dans un autre thread de manière à empêcher l'interface graphique d'être insensible
  • Pour mettre à jour l'interface utilisateur graphique avec les résultats produits par la tâche de longue durée à la fin de la tâche via la méthode done().
  • Pour mettre à jour GUI de temps en temps avec les résultats intermédiaires produits et publiés par la tâche à l'aide des méthodes publish() et process().

SwingUtilities.invokeLater() peut effectuer les tâches ci-dessus comme suit:

  • Au lieu d'exécuter SwingWorker.execute() méthode de l'EDT, nous pouvons exécuter ExecutorService.submit(new MyRunnable()) car il permettra également de créer un autre thread qui peut exécuter la tâche de longue durée.
  • Pour la mise à jour GUI à la fin de la tâche, nous pouvons mettre du code (écrit en done() méthode de case1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) à la fin de la tâche.
  • GUI mise à jour au milieu de la tâche, nous pouvons mettre le code (écrit en process() méthode de affaire1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) à l'endroit où nous avons appelé méthode publish() dans affaire1.

Je pose cette question parce que le problème spécifié en question Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT peut être résolu par SwingUtilities.invokeLater() mais ne peut pas être résolu avec SwingWorker

+1

Je ne suis pas tout à fait sûr de ce que la 'question' est. – akf

+0

@akf si vous n'êtes pas sûr, alors laissez-le. Simple :) –

+0

Le problème auquel vous faites référence est résolu en utilisant SwingWorker. Voyez ma réponse là-bas. –

Répondre

6

SwingWorker est une classe d'aide - ce n'est pas que vous besoin de l'utiliser, mais l'utiliser est beaucoup plus simple et plus clair que de faire le même travail à la main. Notez que la version 6 a été ajoutée. Certaines personnes utilisaient auparavant une classe plus simple définie dans le didacticiel Swing ou une étape similaire à celle que vous avez notée.

+0

+1 De manière pratique, il existe un back-port compatible source pour Java 5. https://swingworker.dev.java.net/ – trashgod

1

Une caractéristique importante de la classe 1.6+ SwingWorker est la différence EDT (Event Dispatch Thread) entre doInBackground() et done(). Vous devriez considérer doInBackground() comme doWorkOutsideEDT() et done() comme doWorkInsideEDT(). Exécutez cet exemple d'instruction pour voir les différents.

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

Sortie:

TID=1 (main) 

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

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here. 
Questions connexes