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 это может помочь сделать вещи яснее.