tutorial thread java swing thread-safety

thread - ¿Deberíamos usar EventQueue.invokeLater para cualquier actualización de GUI en una aplicación de escritorio Java?



java worker (3)

Debe hacer esto solo si aún no está en el hilo de envío del evento. A menos que haya iniciado nuevos hilos o ejecutado el código del hilo principal, probablemente todo su código ya se ejecute desde el hilo de envío del evento, haciendo que esto sea innecesario. Por ejemplo, todos los manejadores de eventos de UI son llamados en el hilo de envío del evento, por lo que no necesitaría hacer eso para el código llamado desde allí.

Sé que al usar este método, el parámetro ejecutable se envía al sistema EventQueue. Pero, ¿deberían hacerse todas las actualizaciones de GUI utilizando este método? Quiero decir, si quiero decir, cambiar un texto de JButton, ¿debería usar algo como esto?

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { jButton1.setText("changed text"); } });

Si debería usar este enfoque, ¿puedo usar cualquier patrón para evitar este código repetitivo?


En lugar de evitar verdaderamente "repetitivo" (probablemente la gente de Java diga, código legible sin muchos secretos) podría usar la función de plantillas de Eclipse. Lo tengo configurado para expandir las dos letras "il" al siguiente bloque:

EventQueue.invokeLater(new Runnable() { public void run() { try { // do something. } catch (Exception e) { e.printStackTrace(); } } });

Aparentemente, este diseño de cola de envío no solo se recomienda, básicamente es obligatorio. Esta es quizás la forma más ruidosa que he visto en cualquier idioma de enviar una lambda a una cola de mensajes. Pero ahí está. Esto es java Y en defensa de Java, desde luego, es obvio lo que está sucediendo exactamente. Me molesta la cantidad de tipeo, pero lo único que puedo pensar que evitaría es el preprocesador Mac, y apuesto a que a la gente de Java no le gusta usar eso. La expansión de código a través de plantillas es más legible, compatible y no implica magia negra.


Solo necesita utilizar invokeLater cuando desee actualizar su UI desde otro hilo que no sea el hilo de UI (hilo de envío del evento).

Supongamos que tiene un controlador para hacer clic y desea cambiar el texto de una etiqueta cuando alguien hace clic en el botón. Entonces es perfectamente seguro para establecer el texto de la etiqueta directamente. Esto es posible porque el controlador para el evento de clic de botón se ejecuta en el subproceso de interfaz de usuario.

Supongamos, sin embargo, que en otro botón-clic inicia otro hilo que hace algo de trabajo y después de que este trabajo haya terminado, desea actualizar la interfaz de usuario. Luego usa invokeLater . Este método asegura que su actualización de UI se ejecute en el subproceso de interfaz de usuario.

Por lo tanto, en muchos casos, no es necesario invokeLater , simplemente puede hacer actualizaciones de UI directamente. Si no está seguro, puede usar isDispatchThread para verificar si su código actual se está ejecutando dentro de la isDispatchThread de distribución del evento.