Источник
Метод invokeAndWait () выглядит аналогично, но имеет три важных семантических различия. Во-первых, метод invokeLater () будет выполняться асинхронно в будущем. Вы не знаете, когда это будет на самом деле. С другой стороны, метод invokeAndWait () является синхронным: он не возвращается, пока его цель не завершила выполнение. Таким образом, как правило, вы должны использовать метод invokeAndWait (), чтобы прочитать значение компонентов Swing или убедиться, что что-то отображается на экране, прежде чем продолжить выполнение программы. В противном случае вы можете использовать метод invokeLater ().
Второе отличие состоит в том, что метод invokeAndWait () сам по себе не может быть вызван из потока диспетчеризации событий. Поток, выполняющий метод invokeAndWait (), должен ждать, пока поток, управляющий событиями, не выполнит некоторый код. Никакой поток, в том числе поток событий, не может ждать, пока он сам что-то сделает. Следовательно, если вы выполняете метод invokeAndWait () из потока диспетчеризации событий, он генерирует ошибку java.lang.Error. Это приводит к завершению потока диспетчеризации событий (если вы не предприняли необычный шаг по отлову объектов Error в вашем коде); в свою очередь вся ваша программа становится отключенной.
Третье отличие состоит в том, что метод invokeAndWait () может вызвать исключение InterruptedException, если поток прерывается до того, как поток, отправляющий событие, запускает цель, или InvocationTargetException, если объект Runnable выдает исключение или ошибку времени выполнения.
-IvarD