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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top