2011-11-13 23 views
6

Quiero esperar a que mi SwingWorker termine de funcionar, y luego quiero ejecutar otro SwingWorker. En este caso, Encrypteer3 es una clase que amplía el SwingWorker.Espere a que SwingWorker termine

Mi código:

input = txtTekst.getText(); 
    key = txtKey.getText(); 
    System.out.println("thread1 start"); 
    Encrypteer3 a = new Encrypteer3(); 
    a.execute(); 
    while(a.isDone()==false){ 
     // do nothing 
    } 
    input = output; 
    key = txtKey1.getText(); 
    System.out.println("thread2 start"); 
    Encrypteer3 b = new Encrypteer3(); 
    b.execute(); 
    while(b.isDone()==false){ 
     // do nothing 
    } 

Esto hace que se bloquea el GUI y utiliza una gran cantidad de CPU (java utiliza alrededor del 95% de la CPU cuando se ejecuta este). Creo que el problema es que constantemente se comprueba si el hilo está hecho y eso es lo que lo hace tan intensivo en la CPU.

No hay método join() en una clase SwingWorker. ¿Cómo puedo hacer esto menos intensivo de la CPU?

Respuesta

3

creo que el uso de bucle vacío es mala idea, SwingWorker tiene

protected void done() 

donde puede definir código que se ejecuta cuando esté terminado, continuación, puede utilizar listerners y acciones de disparo para que si se desea ejecutar fuera de SW

+2

el problema es que utilizo ese SwingWorker un número diferente de veces dependiendo de la situación. ¡Utilicé el PropertyChangeListener y ese fue el truco! gracias por la respuesta – user1026090

+1

@ user1026090: sí, un PropertyChangeListener es otra gran manera de resolver su problema. 1+ para ti y para java, mkorbel y kowser. –

3

necesita reemplazar el método done de SwingWorker.

De la documentación de SwingWorker#done()

ejecutado en el Hilo de distribución de eventos después del método doInBackground ha terminado. La implementación predeterminada no hace nada. Las subclases pueden anular este método para realizar acciones de finalización en el subproceso de envío de evento. Tenga en cuenta que puede consultar el estado dentro de la implementación de este método para determinar el resultado de esta tarea o si esta tarea se ha cancelado.

public class Encrypteer3 extends SwingWorker<Void, Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     // background task 
     return null; 
    } 

    @Override 
    protected void done() { 
     // will be executed when background execution is done 
    } 

} 

y su while(a.isDone()==false) { la que se está llevando tiempo para ejecutarse.

while(a.isDone()==false) { 
    // do nothing 
} 
0
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker. 

mejor que comprobar if(isDone) sería implementos Executor, pero en todos los casos (es decir, SwingWorker) tiene que comprobar esto thread, cómo conseguir excepción (s) de método anidado (s)

Cuestiones relacionadas