Java EventQueue.为什么一切都应该在invokelater方法中?

nic*_*cks 7 java swing multithreading event-dispatch-thread

在我正在阅读的书中,带有多线程的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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

(我的意思是EventQueue).但是不是主(EDT)线程中自动执行的代码?

no.*_*ing 13

主线程与EDT不同.如果你添加System.out.println(Thread.currentThread().getName()你会看到它打印出来的main内部main()AWT-EventQueue-0时间的run()方法Runnable.

下面讨论Swing单线程规则的历史,这可能有助于使事情更加清晰.


Sta*_*lin 6

桌面GUI应用程序通常以这种方式工作.gui有一个线程,其余应用有一个或多个线程.使用EventQueue您指定GUI线程应该从其他线程执行的操作.