2010-10-04 5 views
8

Je souhaite pouvoir utiliser la sous-classe SwingWorker multi-times est-ce possible, comme je l'ai lu dans le document java "SwingWorker est uniquement conçu pour être exécuté une fois.Exécuter un SwingWorker plus d'une fois n'entraînera pas l'invocation la méthode doInBackground deux fois. "exécuter plusieurs fois SwingWorker

Des idées?

Merci

+1

Voulez-vous dire que vous voulez réutiliser votre classe d'implémentation SwingWorker ou l'instance de la classe? – Qwerky

+0

Je ne sais pas peut-être que j'ai quelque chose de mal mais quand je crée des instances de travail et appelez la méthode execute() rien ne sera exécuté. Cependant, quand j'ai essayé d'appeler la méthode doInBackground() les travailleurs ont exécuté –

Répondre

8

Un exemple d'une classe implémentant SwingWorker peut être en effet couru qu'une seule fois. Il n'y a aucune limitation à l'instanciation d'autant d'instances que vous avez besoin et à leur exécution.

+1

Il y a une limitation, le fait que plusieurs objets doivent être collectés par le garbage, ce qui en fait une limitation. Pour les petites applications, cela peut ne pas avoir d'importance, mais pour les applications extrêmement volumineuses qui sont obligées de minimiser le nombre de choses qui sont récupérées par la poubelle pour des raisons de performances, c'est une limitation. Dire, tout de suite, qu'il n'y a pas de limites n'est pas correct ... juste parce que ça ne s'applique pas à tout le monde, ça n'en fait rien. – searchengine27

+0

Avez-vous lu le limita tihon de la classe? Cela ne fonctionnera pas si une instance est exécutée plus d'une fois. Il n'y a pas d'alternative. Et si la mémoire est une limitation très probablement Java n'est pas la bonne solution. Donc, si Java est utilisé et qu'il y a suffisamment de mémoire, il n'y a pas de limitations. Pour les applications plus importantes, cela ne pose aucun problème. Ils doivent être conçus pour la collecte partielle des ordures. Les cas extrêmes peuvent nécessiter quelque chose comme un disrupteur, mais il n'y a aucun sens à ce que l'interface utilisateur soit intégrée dans Swing –

+1

Umm ... il existe une alternative. Avoir une seule instance d'un runnable, et un 'ExecutorService'. Même dans la documentation de 'SwingWorker', il est dit que c'est une classe de commodité. Il y a facilement d'autres alternatives. 'SwingWorker' n'est approprié que lorsque vous pouvez renoncer à certaines choses pour les autres. – searchengine27

1

Vous ne pouvez pas instancier autant d'instances que vous le souhaitez et les exécuter. Dans la classe SwingWorker existe javax.swing.SwingWorker. MAX_WORKER_THREADS = 10. Vous pouvez donc exécuter un maximum de 10 instances. Une instance est libérée seulement il passe 10 minutes en temps mort. N'utilisez pas l'instance SwingWorker en tant qu'instance Thread, ce n'est pas un thread.

0

Essayez de faire ceci:

private void startTask() {// main method that creates the background task or class that implements the SwingWorker 

    AppContext appContext = AppContext.getAppContext(); 
    if(appContext!=null){ 
     appContext.remove(SwingWorker.class); 
    } 
    MassiveMigrationTask task = new MassiveMigrationTask();// class that implements the SwingWorker 
    task.execute();// this process implicitly adds the SwingWorker.class to the appContext 
    } 

Comme la description: "Le AppContext est une table référencée par ThreadGroup qui stocke des instances de service d'application." Donc, ce problème se produit essentiellement parce que AppContext enregistre le nom du thread appelé SwingWorker ..., donc si vous essayez de créer une autre instance du thread, vous aurez probablement aucun succès, car il évalue ce nom de thread avant d'exécuter une nouvelle ou au moins mis le nouveau dans le tas de fils à exécuter, ne consulter gratuitement le code ici:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/AppContext.java

PS: Important: "Si vous n'êtes pas en train d'écrire un service d'application, ou ne savez pas ce que l'on est, s'il vous plaît ne pas utiliser cette classe "