Evitando bloquear el GUI con SwingWorker
En ocasiones nuestros programas necesitan realizar operaciones de larga duración que llevan mucho tiempo como consultas a bases de datos o accesos de lectura/escritura a archivos grandes. Esto ocasiona que la GUI de nuestra aplicación no se refresque y se quede ‘congelada’ hasta que termina la operación de larga duración, lo que confunde al usuario que no sabe si debe esperar o si la aplicación se ha quedado ‘colgada’. Cualquier tarea que lleve más de medio segundo debería ser ejecutada en un hilo aparte del hilo de ejecución de swing.
Vamos a ver una pequeña introducción de la forma de gestionar los hilos de swing para hacernos una idea general de su funcionamiento.
Básicamente podemos decir que hay dos hilos de ejecución principales: el hilo que inicia la aplicación cuando creamos la GUI y el EDT conocido como Event Dispatching Thread que es el que nos interesa.
El EDT es el hilo de ejecución de las aplicaciones Swing. Este se encarga de dibujar y actualizar los componentes del GUI además de registrar los eventos generados por estos. Es una cola de tipo FIFO que procesa las tareas de una en una secuencialmente, lo que significa que hasta que una tarea no termina no puede empezar la siguiente.
Aquí es donde se encuentra el problema, ya que si ejecutamos las operaciones de larga duración dentro del hilo EDT provocamos que no se puedan repintar los componentes Swing asi como impedimos que pueda responder a eventos de teclado o ratón.





