Ejecución síncrona mediante Foxtrot

Foxtrot es un pequeño framework cuyo objetivo es facilitar la gestión de threads con Java Foundation Classes (librerías JFC para Java Swing). En principio, es compatible hasta con la versión 6 de J2EE, por lo que podrían aparecer problemas de compatibilidad si queremos migrar nuestro proyecto a versiones superiores. Por lo que te estoy comentado, ya te puedes imaginar que no se trata de un framework que actualmente se emplee en la creación de nuevos proyectos. Sin embargo, como siempre digo, nuestra carrera laboral es muy larga y nada impide que en un momento dado te toque mantener una aplicación desarrollada en Java Swing.

 

 

Básicamente, lo que hace el framework Foxtrot es reenrutar la ejecución del evento actual del thread EDT de Swing hacia un Worker Thread (WT). De esta manera, el EDT queda liberado para procesar otros eventos. Aunque Foxtrot dispone de varias versiones, las más utilizadas son la versión 3 (liberada en 2008) y la versión 4 (liberada en 2011). Desde entonces ya no se han lanzado nuevas versiones, obviamente debido al retroceso que ha ido experimentando la utilización de Java Swing en las aplicaciones creadas a partir de aquellas fechas. El core de las librerías Foxtrot se encuentra en el siguiente paquete:

 

foxtrot-core-4.0.jar

 

Ejecución síncrona mediante Foxtrot


El framework Foxtrot se utiliza para adoptar una solución síncrona en el tratamiento de threads de Java Swing. En concreto, permite que el hilo de ejecución EDT (Event Dispatch Thread) de Swing entre en un método listener pero no le deja salir inmediatamente (como ocurre en la soluciones asíncronas). De hecho, la ejecución del resto del listener no se producirá hasta que no concluya la tarea especificada en el hilo Worker de Foxtrot. Para que te hagas una idea, el funcionamiento sería similar al implementado en las ventanas modales de AWT.


Cuando un hilo de ejecución Swing captura un evento dentro de un método Listener, el proceso de funcionamiento de Foxtrot sería algo así:

 

1º) Foxtrot permite al thread EDT entrar pero no retornar del listener.

2º) El Worker de Foxtrot lanzará una Task que abrirá un nuevo thread WT en el que se ejecutará el evento de listener que estábamos tratando.

3º) De este modo, el EDT continuará procesando otros eventos recogidos de la cola de eventos.

4º) Cuando termine la tarea del thread del Worker, Foxtrot reenrutará el EDT para que termine de ejecutar el resto del proceso del listener inicial.

 

De este modo, se consigue que el consumo de tiempo derivado de la ejecución de la funcionalidad del Listener se derive al thread Worker de Foxtrot. Por tanto, se liberan así los recursos del thread EDT de Swing, que podrá seguir gestionando otros eventos. Una vez que el Worker ya ha completado la tarea, entonces el EDT continuará con la ejecución del resto de lógica del Listener (que normalmente consistirá únicamente en finalizar la ejecución del proceso de dicho listener).

 

Hay que comentar que Foxtrot puede lanzar dos tipos de procesos:

  • Proceso Task: Tarea que se ejecuta en el Worker thread y que captura las excepciones producidas.

  • Proceso Job (hereda de Task): Tarea ejecutada en el Worker thread que no genera excepciones.

 

 

Ejemplo básico de Worker Foxtrot

 

Un ejemplo básico de lo que podríamos encontrarnos en una implementación Java Swing con Worker Foxtrot sería el siguiente:

 

 
      if (SwingUtilities.isEventDispatchThread()){
        Worker.post( 
          new Job() {
          public Object run () {
            modalWindow.waitForClose();
            return "";
          }
        }
        );
      }
 

 

En este código, que podemos imaginarnos que está dentro de la captura de un evento en un listener, lo que se hace en primer lugar es verificar si se está ejecutando el hilo principal EDT de Swing.

 

✅ En caso afirmativo, se genera un nuevo hilo Worker de Foxtrot. El método post() sirve para incluir el proceso Foxtrot (que puede ser una Task o un Job) dentro de la cola del Worker. En este ejemplo concreto vemos que el proceso Foxtrot se ha definido como un Job().


Dentro del Job habrá que definir el método run(), donde se especificará la lógica funcional que debe ejecutarse dentro del hilo Worker de Foxtrot. Mientras no finalice la ejecución de este método, no se dará por concluido el Worker y, por tanto, no se continuará con la ejecución del resto de instrucciones incluidas en el evento del listener.

 

Al mismo tiempo que se ejecuta el hilo de Foxtrot, el thread EDT continuará con el procesamiento del resto de eventos que vayan apareciendo en la cola de eventos (esto es, el resto de eventos no relacionados con el listener que ha quedado bloqueado por el Worker). 


Una vez finalice la ejecución del Worker, Foxtrot devolverá el control al hilo EDT de Swing, indicándole que deje de procesar el resto de eventos de la cola de eventos y que continúe con la ejecución del resto de funcionalidad del listener. Como vemos, se trata de un proceso síncrono, puesto que el evento del listener no finaliza hasta que previamente no concluye la ejecución de la tarea del Worker de Foxtrot.

 


Conclusión

 

Y bueno, en líneas generales, este sería el funcionamiento del framework de Foxtrot. Como vemos, se trata de una herramienta sencilla cuyo uso estaba bastante extendido en Java Swing. Si nunca llegas a encontrarte con un Java de esa época, pues esto será culturilla general para ti. Pero si por casualidad tienes que enfrentarte a Java Swing, pues aquí tendrás detallada la forma de implementar un proceso síncrono mediante Foxtrot.


Pues nada, eso es todo, ya sólo nos queda despedirnos hasta el siguiente post. Espero que lo explicado en el artículo de hoy te haya quedado lo suficientemente claro. En caso contrario, ya sabes que puedes dejarme tus dudas aquí abajo.

Saludos.


Comentarios

Entradas populares de este blog

Componentes y Ventanas de Java Swing

Creación de Webservice SOAP básico

Fichero standalone del Servidor JBoss EAP