2010-06-08 6 views
2

J'essaie d'exécuter un SwingWorker (SubWorker) à partir d'un autre SwingWorker (MainWorker), puis je souhaite que MainWorker attende que le SubWorker se termine. En attendant, MainWorker devrait se mettre à jour en fonction des changements de propriétés de SubWorker.Exécution de SwingWorker à partir de SwingWorker - attend jusqu'à ce que le premier s'arrête

public class MainWorker extends SwingWorker<Void,Void> 
{ 
    public Void doInBackground() 
    { 
     SubWorker sw = new SubWorker(); 
     sw.execute(); 
     try { 
      network.get(); // wait for completion 
     } catch (Exception ex) { 
     } 
     return null; 
    } 
} 

Le problème est que la méthode doInBackground du SubWorker n'est pas appelé jusqu'à ce que la MainWorker terminée, tandis que le MainWorker attend le SubWorker pour terminer. Comment puis-je laisser le SubWorker fonctionner parallèlement aux activités MainWorker?

Répondre

3

Si vous n'avez qu'un seul sous-travailleur, je ne suis pas sûr de savoir quel est le point - pourquoi ne pouvez-vous pas simplement exécuter la tâche dans le corps SW?

Si vous avez plusieurs sous-tâches parallèles et que vous souhaitez les regrouper et rendre compte de leur progression, vous n'avez pas vraiment besoin de SwingWorkers séparés: lancez simplement des threads ou utilisez un exécuteur pour planifier les tâches. Si vous souhaitez publier des résultats provisoires, passez une file d'attente de blocage aux tâches, où elles pousseront les mises à jour. Le principal (ou plutôt le seul) SwingWorker prendrait les éléments de cette file et mettrait à jour l'interface graphique en utilisant les méthodes publish()/process(). Lorsqu'une sous-tâche termine son travail, elle peut pousser un jeton spécial dans la file d'attente (ou null). C'est ainsi que vous pouvez suivre les sous-tâches en cours et décider quand mettre fin à la boucle. Alternativement, si vous avez un tas de tâches autonomes, vous pouvez utiliser CompletionService et mettre à jour le statut de la même manière que le logiciel.

+0

Merci, en utilisant un Executor résout le problème. – RemiX

Questions connexes