Decir que tengo el siguiente código:¿Cómo espero el método doInBackground() de SwingWorker?
import java.lang.InterruptedException;
import javax.swing.SwingWorker;
public class Test
{
private JDialog window;
public Test
{
// instantiate window
}
private class Task extends SwingWorker<Void, Void>
{
public Void doInBackground()
{
try { Thread.currentThread().sleep(5000); }
catch(InterruptedException e) {}
return null;
}
}
public void doTask()
{
Task task = new Task();
task.execute();
}
protected void process()
{
// update various GUI components here
}
public static void main(String args[])
{
Test t = new Test();
t.doTask();
System.out.println("done");
}
}
tengo que esperar hasta t.doTask()
se realiza antes de imprimir 'hecho', pero no estoy seguro exactamente cómo. Sé que probablemente debería usar join()
aquí, pero necesito un hilo para invocarlo, y no sé cómo obtener el hilo doInBackground()
desde donde necesito llamar al join()
. Gracias por cualquier ayuda.
EDIT: Gracias por las respuestas. Desafortunadamente, get()
y similares no resuelven del todo el problema. En mi código actual, SwingWorker también tiene una función process()
reemplazada que actualiza una ventana de GUI mientras se ejecuta el hilo de fondo. get()
detiene la impresión de 'listo' hasta después de doInBackground
, pero luego la GUI no se actualiza. Actualicé mi código de muestra para reflejar esto, aunque ahora, por supuesto, no compilará.
¿Hay alguna forma de 'hacerlo' para imprimir solo una vez que doInBackground
haya terminado? ¿El código de actualización de la GUI y la declaración 'done' están en el mismo hilo? ¿Necesito hacer un nuevo hilo?
Bien, lo tengo trabajando usando 'done()'. Gracias por tu ayuda. – Max
Nota para futuros usuarios de Google: esto realmente no ayuda cuando el SwingWorker ha sido cancelado. 'done()' puede ejecutarse antes de que 'doInBackground()' complete. :-(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6826514 http: // stackoverflow.com/questions/6204141/swingworker-when-exactly-is-called-done-method – kmort