lunes, diciembre 18, 2006

JDK 1.6: La clase SwingWorker

En principio, esta clase no es completamente nueva (de hecho, estaba creada de manera separada al JDK -aquí pueden ver la antigua versión-). Pero en la última versión del JDK, ya la encontramos como parte integrante del paquete javax.swing. El objetivo de esta clase es la de implementar en un hilo/thread separado, cualquier funcionalidad que pudiera requerir mucho consumo de tiempo. Así por ejemplo, podríamos tener un worker que cargara imágenes para crear una animación dentro de un applet, o un worker que actualizara componentes en pantalla.
Es sumamente útil para crear aplicaciones de escritorio que no se queden "tildadas" mientras el programa realiza alguna operación de larga duración.
Describiré en este post cómo funciona esta clase. En el próximo mostraré un ejemplo andando:

La clase SwingWorker es una clase abstracta, lo que significa que para usarla, deberemos o bien, crear una nueva clase que herede funcionalidad o crear una clase interna (generalmente, el más usado y recomendable por el acceso que nos da al resto de los componentes visuales). La figura nos muestra también, que esta clase no extiende de ninguna otra, sino que implementa 3 interfaces. Evidentemente la interfaz Runnable sirve para que esta clase se comporte como un hilo de ejecución. La interfaz Future sirve para retornar un resultado de alguna computación asincrónica (es decir, esperar hasta que se complete una operación y se pueda retornar el resultado). Por último, la interfaz RunnableFuture sirve para asociar un Future con el método run().

No hay que olvidar que un SwingWorker es un hilo de ejecución. Esto significa que deberemos tener el mismo cuidado que tendríamos al escribir cualquier hilo de ejecución.
Sin embargo, hay ciertas propiedades que hacen de esta clase, un poco más especial. Por ejemplo, un Worker se ejecuta sólo una vez. Por más de que llamemos al método de ejecución una y otra vez, esto no hará que se ejecute como un hilo de ejecución aparte.
Además, el SwingWorker, puede interactuar con el resto de la aplicación por medio de eventos. Esto es importante, porque pasamos responsabilidad al Event Dispatch Thread de Java (este hilo es cargado automáticamente por cualquier aplicación visual de Java y es el encargado de manejar todos loa eventos visuales que se produzcan).

Funcionamiento

Bien, como la clase SwingWorker es abstracta, significa que deberemos sobrescribir algunos de sus métodos.
El principal y más importante de estos métodos es el T doInBackGround() throws Exception Recuerden que la T proviene de Generics y simboliza un tipo de datos. Podrían considerar a este método como el run() de la clase Thread. El objetivo de este método es el de ejecutar todas las operaciones de alto costo de tiempo. En definitiva, aquí deberemos escribir todo el procesamiento.
Existe otro método necesario, void done() Este método será invocado por el Event Dispatch Thread automáticamente cuando doInBackGround() termine su ejecución. No es un método de finalización en sí, pero nos sirve para realizar acciones de completado de nuestro worker.
Por último, existe el método public final void execute() Este método sirve para dar el puntapié inicial a nuestro worker. Si lo comparamos con la clase Thread, sería el start() de nuestro hilo.

En el siguiente gráfico, se ve en líneas generales el contexto de un worker. Los métodos publish() y process() sirven para interactuar en forma asíncrona con el resto de la aplicación (aplicando una versión del patrón publicar-suscribir)
En el próximo post, mostraré un ejemplo concreto.


Saludos PF

3 Comments:

At 1:16 a. m., Anonymous Anónimo said...

Excelente, veo que te estas tomando en serio las mejoras hechas en swing, en la version 1.6.

Saludos

Juan Sebastián Arbona
http://jroller.com/page/javillion

 
At 1:42 a. m., Blogger Zeithgeist said...

Pablo.... Vos ibas/vas al Famaf men!?

 
At 1:54 a. m., Blogger Pablo Frias said...

Juan: si, aunque no he decidido aún si me quedo con SwingWorker o los tradicionales Threads "a medida"

zeithgeist: Nop, lo más cercano al famaf son unos amigos. Pero tengo varios dobles por ahí (jeje! en serio)

 

Publicar un comentario

<< Home