Очередь событий Java. Почему все должно быть в методе invokelater?

в книге, которую я читаю, каждый пример графического интерфейса с многопоточностью имеет что-то вроде этого:

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);
        }
    });
}

(я имею в виду очередь событий). но разве код не выполняется автоматически в основном (EDT) потоке?


person nicks    schedule 25.04.2011    source источник


Ответы (2)


Настольные приложения с графическим интерфейсом обычно работают таким образом. Существует один поток для графического интерфейса и один или несколько потоков для остальных приложений. Используя EventQueue, вы указываете, что поток GUI должен делать из других потоков.

person Stan Kurilin    schedule 25.04.2011
comment
По-видимому, в свингах это называется правилом одного потока. События Swing обрабатываются из потока событий, который берет эти маленькие Runnable() экземпляры и запускает их. - person Warren P; 16.09.2011
comment
@Warren P, полностью согласен. Я просто попытался объяснить это самым простым способом. Кстати, спасибо за исправления грамматики. - person Stan Kurilin; 16.09.2011

Основной поток отличается от EDT. Если вы добавите System.out.println(Thread.currentThread().getName(), вы увидите, что он распечатает main в main() и AWT-EventQueue-0 в методе run() метода Runnable.

Вот обсуждение истории однопоточного правила в Swing, которое может помочь прояснить ситуацию.

person no.good.at.coding    schedule 25.04.2011