Java EventQueue. Почему все должно быть в методе invokelater? - PullRequest
7 голосов
/ 25 апреля 2011

в книге, которую я читаю, каждый пример 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 ]

13 голосов
/ 25 апреля 2011

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

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

6 голосов
/ 25 апреля 2011

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

...