Однозаходные-модель и EDT
Большинство современных библиотек UI принять single-thread-model
.Это означает, что все манипуляции с компонентами пользовательского интерфейса ДОЛЖНЫ выполняться на одном и том же потоке. Зачем? Это связано с тем, что обновление компонентов пользовательского интерфейса из нескольких потоков приведет к хаосу с most Swing object methods are not "thread safe". Для простоты, эффективности и надежности применяется однопоточная модель.
В Swing самая нить, обслуживающая single-thread-model
, называется Event Dispatching Thread, то есть EDT. Свинг не предоставляется. Он предоставляется Abstract Window Toolkit, то есть AWT.
рабочий поток UI против резьбы
Нетривиального приложение с графическим интерфейсом, как правило, имеет много потоков. В современном графическом приложении может быть много рабочих потоков для грязной работы, но есть только один поток UI (Swing называет его EDT) для обновления GUI. Рабочие потоки, как правило, должны отражать их прогресс в графическом интерфейсе, поэтому им необходимо обмениваться информацией с потоком пользовательского интерфейса. Итак, как происходит это общение?
java.awt.EventQueue
Связь происходит через модель очереди сообщений. java.awt.EventQueue
- это самый класс, который предоставляет очередь событий глобально. Эта глобальная очередь событий служит каналом связи с EDT. EDT собирает сообщения из этого EventQueue и обновляет компоненты пользовательского интерфейса соответственно. Если какая-либо другая часть вашей программы хочет манипулировать пользовательским интерфейсом, эта часть кода должна вызвать EventQueue.invokeLater()
или EventQueue.invokeAndWait()
для отправки сообщения в EventQueue. EDT обработает все ожидающие сообщения в EventQueue и, в конечном итоге, получит сообщение.
основной поток
Ваш фрагмент кода обычно находится в main()
потока, main
нить можно рассматривать как какой-то worker thread
здесь. Только это вместо обновления графического интерфейса, отправляя сообщения в EventQueue, инициирует графический интерфейс. Во всяком случае, инициацию можно рассматривать как вид работы, тоже.
После запуска GUI основной поток выйдет, и EDT предотвратит выход из процесса.
И еще одно хорошее объяснение:
Java Event-Dispatching Thread explanation
Интересная статья: Multi-threaded toolkit, a failed dream?
вы сделали хорошую работу, и я ясно с этими понятиями теперь !! спасибо .. – Deepak
И что произойдет, если вы просто поместите это в основной метод, без какой-либо обертывания? 'public static void main (String args []) {New JFrame(). SetVisible (true);}' – Martin
@Martin: Затем вы нарушаете правило, что код, который влияет на пользовательский интерфейс, должен быть выполнен в потоке диспетчеризации события. Это может случиться (в большинстве случаев), но может также вызвать ряд ошибок, связанных с условиями гонки и т. Д. Трудно предсказать, что может произойти. Возможно, вы столкнулись с ошибками рисования, может быть, и нет. – yankee