ExecutorService vs Swing Timer
Pregunta
He estado leyendo Filthy Rich Clients últimamente y noté que, aunque la versión de Java es 6, existe No se hace mención del Marco Concurrente. Por lo tanto, hablan de java.util.Timer y javax.swing.Timer, pero no sobre el servicio de ejecución.
Leí las ventajas de ExecutorService en la pregunta " Java Timer vs ExecutorService " ; Y decidí usar este último sobre el primero. Pero el libro habla sobre javax.swing.Timer y sus ventajas de ser específico para el desarrollo de Swing.
Entonces, ¿esto significa que, para el desarrollo de Swing (botones de animación, etc.), javax.swing.Timer sigue siendo una mejor opción o hay una clase relevante en el nuevo Marco concurrente que lo reemplaza?
Solución
Bueno, el temporizador de oscilación al menos se ejecuta en la EDT para que no tenga que envolver todo con llamadas a invokeLater. También se relaciona muy bien con Swing, ya que utiliza acciones, ActionListeners y otras clases relacionadas con Swing.
Me quedo con las tareas relacionadas con Swing Timer for Swing y uso el nuevo paquete concurrente para cosas que no impliquen la actualización de la GUI.
Eche un vistazo a Uso de temporizadores en aplicaciones Swing , ya que podría contener más información para cambiar (lo siento) la decisión.
Otros consejos
Yo diría que para cosas simples relacionadas con el swing, la mejor opción es javax.swing.Timer
debido a las ventajas mencionadas aquí .
Tenga en cuenta que la tarea del temporizador Swing es realizado en el evento de despacho hilo. Esto significa que la tarea puede manipular los componentes de forma segura, pero También significa que la tarea debe Ejecutar rápidamente.
Por otro lado, si necesita realizar operaciones de procesamiento no relacionadas con el swing o más complejas / prolongadas, el ExecutorService
es muy sólido y definitivamente es el camino a seguir.
Solo una sugerencia sobre lo que Bruno recomendó, un patrón para aprovechar las excelentes utilidades de concurrencia de Java 1.5+ sin interrumpir Swing es hacer que su ExecutorService
haga todo el trabajo pesado (como dijo Bruno) pero una vez hecho esto, el subproceso ExecutorService
debería pasar la interacción con los componentes de la interfaz de usuario real al subproceso AWT en un Runnable utilizando uno de:
-
javax.swing.SwingUtilities.invokeAndWait (Runnable doRun)
-
javax.swing.SwingUtilities.invokeLater (Runnable doRun)
Esos métodos pasan el ejecutable para ser ejecutado por el hilo AWT.