При работе с Swing важно знать, что основная обработка свинга (т. Е. Рендеринг) происходит в одном потоке (который не является вашим основным потоком). Это часто называют потоком событий Swing или AWT. Те, кто знаком с JDK pre 1.6, запомнят ошибку «серый прямоугольник», если вы потратили слишком много времени в диспетчере событий для компонента Swing. Что это значит. В любом свинг-приложении у вас будет запущено 2 потока, с которыми вам теперь придется иметь дело. Обычно, если все ваши операции в диспетчере событий (код, который запускается, скажем, при нажатии кнопки) короткие (т. Е. Изменение состояния кнопки), вы можете просто запустить это внутри диспетчера событий. Если ваше приложение будет вызывать веб-службу или базу данных, или состояние вашего приложения определяется внешними событиями (например, jms), или вы просто хотите сделать свой пользовательский интерфейс более интерактивным (например, создать список элементов и иметь возможность сделайте что-нибудь еще) вы должны использовать поток, отличный от потока событий awt (основной свинг). Таким образом, в этих случаях вы создаете новый поток и делаете то, что вам нужно, и когда результаты наконец возвращаются, вам нужно каким-то образом создать событие, которое может выполнить диспетчер awt / swing. SwingWorker - это отличный маленький шаблон проектирования, который позволяет вам сделать это (другой способ - SwingUtilities). Это особенно полезно для извлечения данных из внешних источников или, например, для длинных вычислений (рендеринг графической сцены). Это помогает автоматизировать отправку и последующую реинтеграцию результатов из внешнего потока (кроме потока AWT). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).