2010-10-04 22 views
8

Quiero poder usar la subclase SwingWorker varias veces, esto es posible ya que he leído en el documento de Java "SwingWorker solo está diseñado para ejecutarse una vez. Ejecutar un SwingWorker más de una vez no dará lugar a invocación el método doInBackground dos veces ".ejecutar SwingWorker varias veces

¿Alguna idea?

Gracias

+1

¿Quiere decir que quiere reutilizar su clase de implementación de SwingWorker, o instancia de la clase? – Qwerky

+0

No sé si recibí algo mal, pero cuando creo instancias de trabajo y llamo al método execute() no se ejecuta nada. Sin embargo, cuando traté de llamar al método doInBackground(), los trabajadores ejecutaron –

Respuesta

8

Una instancia de una clase que implementa SwingWorker puede ser de hecho corrió una sola vez. No existen limitaciones para instanciar tantas instancias como necesite y ejecutarlas.

+1

. Existe una limitación, el hecho de que varios Objetos deben ser basura recolectados haciendo esto lo convierte en una limitación. Para las aplicaciones pequeñas, esto puede no importar, pero para aplicaciones extremadamente grandes que se ven obligadas a minimizar el número de elementos que se recogen como basura por motivos de rendimiento, esta es una limitación. Decir, directamente, que no hay limitaciones no es correcto ... solo porque no se aplique a todos no hace que no sea nada. – searchengine27

+0

¿Has leído el límite de la clase? No va a funcionar si una instancia se ejecuta más de una vez. No hay alternativa. Y si la memoria es una limitación, lo más probable es que Java no sea la solución correcta. Entonces, si se usa Java y hay suficiente memoria, no hay limitaciones. Para aplicaciones más grandes eso tampoco es un problema. Deben diseñarse para la recolección parcial de basura. Los casos extremos pueden necesitar algo así como un disruptor, pero no tiene sentido tener una interfaz de usuario integrada en Swing –

+1

Umm ... hay una alternativa. Tener una instancia única de un ejecutable, y un 'ExecutorService'. Incluso en la documentación 'SwingWorker', dice que es una clase de conveniencia. Hay otras alternativas fácilmente. 'SwingWorker' solo es apropiado cuando puedes renunciar a ciertas cosas para los demás. – searchengine27

1

No puede instanciar tantas instancias como necesite y ejecutarlas. En la clase SwingWorker existe javax.swing.SwingWorker. MAX_WORKER_THREADS = 10. De modo que puede ejecutar un máximo de 10 instancias. Una instancia se libera solo para que pase 10 minutos en tiempo de inactividad. No use la instancia de SwingWorker como una instancia de Thread, no es un hilo.

0

Trate de hacer esto:

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 
    } 

Como la descripción: "El AppContext es una tabla referenciada por ThreadGroup que almacena instancias de servicio de la aplicación."

Así que este problema ocurre básicamente porque AppContext está guardando el nombre del subproceso llamado SwingWorker ..., por lo que si intenta crear otra instancia del subproceso, probablemente no tendrá éxito, ya que evalúa el nombre del subproceso antes de ejecutar una nueva o al menos poner el nuevo en el montón de hilos para ser ejecutado, no dude en consultar el código aquí:

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

PS: Importante: "Si usted no está escribiendo un servicio de aplicación, o no sé cuál es, no use esta clase "