Estoy escribiendo una aplicación que ejecuta sus acciones de menú de archivo usando SwingWorker
. Cada método llamado devuelve un valor boolean
que indica si la operación se ejecutó correctamente o no.¿Cómo leo los resultados de SwingWorker * sin * busy wait?
Por el momento estoy usando ocupado esperando el resultado, como esto:
public boolean executeOperation() {
final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// ..
if (aborted) {
return false;
}
// ..
return true;
}
};
worker.execute();
// busy wait
while (!worker.isDone())
;
try {
return worker.get().booleanValue();
} catch (Exception e) {
// handle exceptions ..
return false;
}
}
¿Existe una manera menos intensa de votación-de resolver esto?
Usando worker.get()
directamente no funcionaría, ya que bloquea la EDT, esperando a que la tarea de terminar - lo que significa que incluso los diálogos de abrir desde dentro del SwingWorker
no conseguiría pintado.
EDITAR: Si es posible, me gustaría evitar que el método (o el trabajador) comuniquen su resultado de forma asíncrona. Estoy implementando varios métodos cortos (archivo -> abrir, nuevo, cerrar, guardar, guardar como, salir) que dependen el uno del otro (es decir, cuando intente salir, cerrar llamadas, cerrar podría llamar guardar, guardar podría llamar guardar como). Resolver esto de forma asincrónica parece hacer que el código sea mucho más complicado.
Siempre puede poner un Thread.sleep (100) en el bucle. –
Esto no cambia el hecho de que está sondeando para obtener un resultado, en lugar de que el objeto que realiza el cálculo le indique cuándo está listo. – mcfinnigan