Java EventQueue. Почему все должно быть в методе invokelater?
в книге, которую я читаю, каждый пример 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) потоке?
2 ответов
настольные приложения GUI обычно работают таким образом. Есть один поток для GUI и один или несколько потоков для остальной части приложения. Используя EventQueue
вы указываете, что поток GUI должен делать из других потоков.
основной поток не совпадает с EDT. Если добавить System.out.println(Thread.currentThread().getName()
вы увидите его распечатать main
внутри main()
и AWT-EventQueue-0
, когда в run()
метод Runnable
.
здесь обсуждение истории однопоточного правила в Swing это может помочь сделать вещи яснее.