2010-05-13 9 views
9

SwingWorker viene utilizzato per i seguenti scopi:Java - Differenza tra SwingWorker e SwingUtilities.invokeLater()

  • Per l'esecuzione dei compiti a lungo in esecuzione in un thread diverso in modo da impedire l'interfaccia grafica di essere insensibile
  • Per l'aggiornamento della GUI con i risultati prodotti dall'attività di lunga durata alla fine dell'attività tramite il metodo done().
  • Per l'aggiornamento della GUI di volta in volta con i risultati intermedi prodotti e pubblicati dall'attività con l'aiuto dei metodi publish() e process().

SwingUtilities.invokeLater() possibile eseguire le operazioni di cui sopra come segue:

  • Invece di eseguire SwingWorker.execute() metodo dal EDT, possiamo eseguire ExecutorService.submit(new MyRunnable()) come sarà anche creare un altro filo che può eseguire un'operazione lunga durata.
  • Per l'aggiornamento della GUI al termine dell'attività, è possibile inserire il codice (scritto nel metodo done() del caso1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) alla fine dell'attività.
  • Per l'aggiornamento della GUI nel mezzo dell'attività, possiamo inserire il codice (scritto nel metodo process() del caso1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) nel punto in cui abbiamo chiamato il metodo publish() in caso1.

Chiedo questa domanda, perché il problema determinata in questione Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT può essere risolto con SwingUtilities.invokeLater() ma non può essere risolto con SwingWorker

+1

io non sono abbastanza sicuro che cosa è la 'domanda'. – akf

+0

@akf se non si è sicuri, quindi lasciarlo. Semplice :) –

+0

Il problema a cui fai riferimento è risolvibile usando SwingWorker. Vedi la mia risposta lì. –

risposta

6

SwingWorker è una classe di supporto - non è che si è necessario usarlo, ma usarlo è molto più semplice e chiaro che fare lo stesso lavoro a mano. (Rende anche più semplice controllare i progressi). Si noti che è stata aggiunta la versione 6 - prima di allora alcune persone usavano una classe più semplice definita nel Swing Tutorial o facevano passi simili a quelli che hai notato.

+0

+1 Convenientemente, esiste una back-source compatibile con Java 5. https://swingworker.dev.java.net/ – trashgod

1

Una caratteristica importante della classe SwingWorker 1.6+ è la differenza EDT (Event Dispatch Thread) tra doInBackground() e done(). Dovresti pensare a doInBackground() come doWorkOutsideEDT() e done() come doWorkInsideEDT(). Esegui questo esempio di istruzioni per vedere il diverso.

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

uscita:

TID=1 (main) 

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

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