Explicación de subproceso de distribución de eventos de Java

Recientemente comencé a aprender y explorar los conceptos básicos de la progtwigción de GUI en Java.

Después de haber estado progtwigndo por un tiempo, solo he hecho trabajo o trabajo de backend y, como resultado, lo más cerca que he llegado a las interfaces de usuario es la consola de comandos (es embarazoso saberlo).

Estoy usando Swing y, por lo que puedo deducir, significa que por extensión también estoy usando AWT.

Mi pregunta se basa en este fragmento de código:

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new frame.setVisible(true); } } ); 

He estado investigando esto por un tiempo ya que quería entender completamente esta extraña pieza de código y me he encontrado varias veces con el término ‘Hilo de envío de eventos’. Corrígeme si me equivoco, pero tal como lo entiendo; tiene que ver con el uso de varios hilos y cómo Java Swing interpreta esos hilos. Supongo que el código anterior se usa para asegurarse de que todos los hilos estén “seguros” antes de que cree la ventana, de ahí el invokeLater?

He leído eso:

“Solo puede llamar a métodos que operan en el marco desde el hilo de envío de eventos”

y que solo bajo ciertas circunstancias puede llamar a los métodos que operan en el marco del método principal.

¿Alguien puede aclararme qué es exactamente el hilo de distribución de eventos?

¿Cómo se relaciona con múltiples hilos de ejecución y cómo esos hilos no son seguros para llamar desde el método principal? Además, ¿por qué necesitamos este invokeLater?

¿No podemos simplemente crear la ventana como cualquier otro objeto?

He golpeado un poco un bloque de carreteras en mi investigación ya que no entiendo estas relaciones e ideas.

Una nota al margen es que me gusta basar mi conocimiento en una comprensión profunda ya que creo que esto conduce al mejor resultado general y, como resultado, a los mejores progtwigs. Si entiendo en profundidad cómo funciona algo, entonces puede utilizar los consejos y ajustes de manera efectiva en lugar de simplemente repetirlos en el código, así que no dude en darme explicaciones adicionales y ampliar mis conocimientos.

Gracias.

El subproceso EventDispatching es un subproceso especial administrado por AWT. Básicamente es un hilo que se ejecuta en un evento de procesamiento de bucle infinito. El método java.awt.EventQueue.invokeLater es una forma especial de proporcionar algún código que se ejecutará en la cola de eventos. Escribir un interfaz de usuario que sea seguro en un entorno de subprocesos múltiples es muy difícil, por lo que los autores de AWT decidieron que solo permitirían que las operaciones en objetos de GUI tuvieran lugar en un único hilo especial. Todos los controladores de eventos se ejecutarán en este hilo y todos los códigos que modifiquen la interfaz gráfica de usuario también deberían operar en este hilo.

Ahora, el AWT generalmente no comprueba que no esté emitiendo comandos de GUI desde otro hilo (el marco WPF para C # hace esto). por lo que es posible escribir un montón de código y ser bastante agnóstico y no tener problemas. Pero esto puede llevar a un comportamiento indefinido, por lo que lo mejor es asegurarse siempre de que el código GUI se ejecute en el hilo del despachador de eventos. invokeLater proporciona un mecanismo para hacer esto.

Entonces, un ejemplo clásico es que necesita ejecutar una operación de larga ejecución, como descargar un archivo. Entonces, inicia un hilo para realizar esta acción y luego, cuando se complete, utilizará invokeLater para actualizar la interfaz de usuario. Si no usó invokeLater y en su lugar acaba de actualizar la interfaz de usuario directamente, es posible que tenga una condición de carrera y un comportamiento indefinido podría ocurrir.

Wikipedia tiene más información: http://en.wikipedia.org/wiki/Event_dispatching_thread

Además, si tiene curiosidad sobre por qué los autores de awt no solo hacen que el toolkit sea multiproceso aquí, hay un buen artículo: https://community.oracle.com/blogs/kgh/2004/10/19/multithreaded-toolkits-failed-dream

EventDispatchThread (EDT) es un hilo especial reservado solo para Swing GUI y * Eventos relacionados con Swing, por ejemplo, crear / cambiar / actualizar Swing JComponents , más para preguntas hechas aquí y aquí

toda la salida a la GUI desde BackGround Tasks , Runnable#Thread debe ser envuelto en invokeLater () , desde Objetos sincronizados a invokeAndWait();