Método invokeAndWait en SwingUtilities

Por favor explique el método invokeAndWait () en SwingUtilities. No puedo entender esto. Explícalo muy claramente. Sería de gran ayuda si probaras con un ejemplo.

Editado para agregar la expansión de @noob de la pregunta:

Lo que no está claro acerca de esto ?

Aquí hay un ejemplo de uso modificado:

import javax.swing.SwingUtilities; public class InvokeAndWaitStuff { public static void main(String[] args) { final Runnable doHelloWorld = new Runnable() { public void run() { System.out.println("Hello World on " + Thread.currentThread()); } }; Thread appThread = new Thread() { public void run() { try { SwingUtilities.invokeAndWait(doHelloWorld); } catch (Exception e) { e.printStackTrace(); } System.out.println("Finished on " + Thread.currentThread()); } }; appThread.start(); } } 

Salida:

 Hello World on Thread[AWT-EventQueue-0,6,main] Finished on Thread[Thread-0,5,main] 

¿Y Por qué es esto importante?:

Hace que doHelloWorld.run () se ejecute de forma síncrona en el hilo de envío del evento AWT. Esta llamada bloquea hasta que todos los eventos pendientes de AWT hayan sido procesados ​​y (luego) regrese doHelloWorld.run (). Este método se debe usar cuando un subproceso de aplicación necesita actualizar la GUI.

Hasta donde puedo decir, esto es básicamente un cuello de botella que obliga a las actualizaciones de la GUI a ejecutarse de forma síncrona por un solo hilo, en lugar de hacerlo de forma asincrónica por varios hilos, lo que puede ser potencialmente inseguro.

Para comprender lo que invokeAndWait() hace, primero necesita comprender el modelo de evento / hilo de Swing.

Básicamente, todo lo que afecta a la GUI de alguna manera debe ocurrir en un solo hilo . Esto se debe a que la experiencia demuestra que una GUI de subprocesos múltiples es imposible de corregir.

En Swing, este hilo especial de GUI se llama subproceso de envío de evento o EDT . Se inicia tan pronto como se muestra un componente de nivel superior de Swing, y básicamente es un hilo de trabajo que tiene una cola FIFO de objetos de evento que ejecuta uno tras otro.

Cuando se necesita dibujar o actualizar una GUI de Swing, el JRE coloca un evento en la cola de EDT. Las acciones del usuario que hacen que los oyentes se llamen comienzan como eventos en la cola EDT. Y (esta es la parte importante) todo lo que hace su progtwig que cambia la GUI (como registrar oyentes, agregar / eliminar componentes de la GUI o cambiar los datos del modelo que muestra la GUI) debe colocarse en la cola EDT, o la GUI puede obtener corrompido

Y ahora para finalizar: invokeAndWait() coloca el Runnable le pasas en la cola de eventos EDT y espera hasta que el EDT lo haya ejecutado. Esto se debe usar cuando un subproceso que no es de la GUI debe hacer algo que afecte a la GUI, pero también debe esperar hasta que se complete antes de que pueda continuar. Si solo quiere hacer algo que afecte a la GUI pero no le importa cuando esté terminada, debería usar invokeLater() .

Tuve un problema similar en una JTable. El progtwig fue bloqueado en algún lugar del método “scrollRectToVisible”. Reemplacé la llamada envolviéndola en una invocación invocada. El invokeAndWait no resolvió mi problema de bloque.

  SwingUtilities.invokeLater(new Runnable() { @Override public void run() { table.scrollRectToVisible(r); } });