Single-Thread-Model и EDT
Большинство современных библиотек пользовательского интерфейса принимают single-thread-model
.Это означает, что все манипуляции с компонентами пользовательского интерфейса ДОЛЖНЫ выполняться в одном и том же потоке.Зачем?Это потому, что разрешение обновления компонентов пользовательского интерфейса из нескольких потоков приведет к хаосу, так как большинство методов объекта Swing не являются "потоко-безопасными" .Для простоты, эффективности и надежности принята модель с одним потоком.
В Swing тот самый поток, который обслуживает single-thread-model
, называется Поток диспетчеризации событий , т.е. EDT.Он не предоставляется Swing.Он предоставляется Abstract Window Toolkit , т. Е. AWT.
Рабочий поток против потока пользовательского интерфейса
Нетривиальное приложение с графическим интерфейсом обычно имеет много потоков,В современном приложении с графическим интерфейсом может быть много рабочих потоков для грязной работы, но есть только один поток пользовательского интерфейса (Swing называет его EDT) для обновления графического интерфейса.Рабочие потоки, как правило, должны отражать ход своей работы в графическом интерфейсе, поэтому им необходимо сообщить об этом потоку пользовательского интерфейса.Итак, как происходит это взаимодействие?
java.awt.EventQueue
Обмен данными происходит через модель очереди сообщений.java.awt.EventQueue
- это тот самый класс, который предоставляет очередь событий глобально .Эта глобальная очередь событий служит каналом связи с EDT.EDT получает сообщения из этого EventQueue и соответственно обновляет компоненты пользовательского интерфейса.Если какая-то другая часть вашей программы хочет манипулировать пользовательским интерфейсом, эта часть кода должна вызвать EventQueue.invokeLater()
или EventQueue.invokeAndWait()
, чтобы поместить сообщение в EventQueue.EDT обработает все ожидающие сообщения в EventQueue и в итоге получит сообщение.
основной поток
Ваш фрагмент кода обычно находится в потоке main()
,поток main
можно рассматривать как своего рода worker thread
здесь.Только вместо обновления графического интерфейса путем отправки сообщений в EventQueue он запускает графический интерфейс.В любом случае, инициацию можно рассматривать как тоже вид работы .
После инициализации GUI основной поток завершится, а EDT предотвратит выход из процесса.
И еще одно хорошее объяснение:
Объяснение нити Java-диспетчеризации событий
Интересная статья: Многопоточный инструментарий, несостоявшаяся мечта?