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

#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, полностью согласен. Я просто попытался объяснить это самым простым способом. Кстати, спасибо за исправления грамматики.