java - example - ExecutorService vs Swing Timer
timer java example (3)
He estado leyendo Filthy Rich Clients últimamente y he notado que, aunque la versión de Java es 6, no se menciona el Marco Concurrente. Entonces, hablan sobre java.util.Timer y javax.swing.Timer, pero no sobre ExecutorService.
Leí sobre las ventajas de ExecutorService en la pregunta " Java Timer vs ExecutorService " y decidí utilizar el último sobre el anterior. Pero el libro habla de 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?
Bueno, el Swing Timer al menos se ejecuta en el EDT, por lo que no tiene que envolver todo con llamadas para invocarLater. También se relaciona muy bien con Swing ya que usa Actions, ActionListeners y otras clases relacionadas con Swing.
Me quedaría con las tareas relacionadas con Swing Timer for Swing y usaré el nuevo paquete concurrente para cosas que no impliquen actualizar la GUI.
Eche un vistazo al uso de temporizadores en aplicaciones Swing ya que podría contener más información para oscilar (lo siento) la decisión.
Solo una sugerencia sobre lo que bruno aconsejó, un patrón para aprovechar las excelentes utilidades de concurrencia Java 1.5+ sin romper Swing es hacer que su ExecutorService
haga todo el trabajo pesado (como dijo Bruno) pero una vez hecho esto, el subproceso ExecutorService
debería transferir la interacción con los componentes reales de la interfaz de usuario 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 ejecutados por el subproceso AWT.
Diría que para cosas relacionadas con el swing simple, la mejor opción es javax.swing.Timer
debido a las ventajas mencionadas aquí .
Tenga en cuenta que la tarea del temporizador Swing se realiza en el hilo de envío del evento. Esto significa que la tarea puede manipular componentes con seguridad, pero también significa que la tarea debe ejecutarse rápidamente.
Por otro lado, si necesita realizar operaciones de procesamiento no relacionadas con oscilaciones o más complejas / largas, el ExecutorService
es muy robusto y definitivamente es el camino a seguir.