#java #multithreading #swing #event-dispatch-thread
#java #многопоточность #swing #событие-отправка-поток
Вопрос:
в книге, которую я читаю, в каждом примере GUI с многопоточностью есть что-то подобное:
public static void main(String[] args) throws Exception
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new SomeKindOfFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
(я имею в виду EventQueue). но разве код не выполняется автоматически в основном потоке (EDT)?
Ответ №1:
Основной поток не совпадает с EDT. Если вы добавите, System.out.println(Thread.currentThread().getName()
вы увидите, что это распечатывается main
внутри main()
и AWT-EventQueue-0
когда внутри run()
метода Runnable
.
Вот обсуждение истории однопоточного правила в Swing, которое может помочь прояснить ситуацию.
Ответ №2:
Настольные приложения с графическим интерфейсом обычно работают таким образом. Существует один поток для gui и один или несколько потоков для остальной части приложения. Используя EventQueue
, вы указываете, что поток GUI должен делать из других потоков.
Комментарии:
1. По-видимому, в swing это называется «правилом одного потока». События Swing обрабатываются из потока событий, который берет эти маленькие
Runnable()
экземпляры и запускает их.2. @Warren P, полностью согласен. Я просто попытался объяснить это самым простым способом. Кстати, спасибо за исправления грамматики.