¿Qué hace SwingUtilities.invokeLater?

¿Qué hace SwingUtilities.invokeLater ? ¿Está retrasando la ejecución de un bloque de códigos dentro de su método de run ? ¿Cuál es la diferencia entre llamar una acción dentro de la función invokeLater o simplemente llamarla al final del hilo que queremos que se ejecute? ¿Alguien puede ayudarme con lo que realmente hace la función invokeLater ?

Como han dicho otras respuestas, ejecuta Runnable en el subproceso de despacho de eventos AWT. Pero, ¿por qué querrías hacer eso? Debido a que las estructuras de datos Swing no son seguras para subprocesos, por lo que para proporcionarles a los progtwigdores una forma fácilmente alcanzable de evitar el acceso simultáneo a ellos, los diseñadores de Swing establecieron la regla de que todo el código que accede a ellos debe ejecutarse en la misma cadena. Eso ocurre automáticamente para el manejo de eventos y el código de mantenimiento de la pantalla, pero si has iniciado una acción de larga duración (en un nuevo hilo, por supuesto), ¿cómo puedes señalar su progreso o finalización? Tienes que modificar un control de Swing, y tienes que hacerlo desde el hilo de envío de eventos. Por invokeLater tanto invokeLater .

Ejecutará la pieza de código en el subproceso AWT. Lo cual le permite modificar la GUI desde otros hilos.

De Docs :

Hace que doRun.run () se ejecute de forma asincrónica en el hilo de despacho del evento AWT. Esto sucederá después de que se hayan procesado todos los eventos pendientes de AWT. Este método se debe usar cuando un subproceso de aplicación necesita actualizar la GUI.

ese sería el Comentario, pero parece tan largo como …, solo cosas básicas

1 / cree su propio EDT para la actualización correcta de la GUI, fe si se ejecuta algún código usando el hilo simple de vainilla, java.util.Timer , Executor … más aquí

2 / ayuda a establecer el Enfoque a los JComponentes si hay algunos Oyentes porque si hay un Oyente de Documentos entonces es difícil establecer el Focus en los JComponents deseados

3 / las ejecuciones de código de demora bloquean y mueven eso hasta los extremos de EDT

Como ya se mencionó, InvokeLater le permite llamar de manera segura a los métodos en las clases de swing cuando no se está ejecutando en el EventQueue, para empezar. Sin embargo, puede simplificar su código y su vida accediendo a otros campos y clases solo desde EventQueue. Pueden trabajar con swing y entre sí sin todas las molestias de multi-threading. Si ha iniciado otro hilo, utilice InvokeLater para volver a EventQueue lo más rápido posible y minimice la cantidad de campos que deben sincronizarse o protegerse.

Si necesita aprovechar al máximo varios núcleos, tendrá que reducir el uso de EventQueue y tendrá que pagar un alto precio en complejidad.

Tenga en cuenta que eventualmente recibirá una llamada a su método doRun.run () cada vez que llame a invocarLater (doRun). Entonces, si lo llama diez veces antes de que el hilo del evento tenga la oportunidad de realizar su procesamiento, es probable que reciba diez llamadas sucesivas a doRun.run ().