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

在我正在阅读的书中,带有multithreading的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)线程中自动执行的代码?

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

主线程与EDT不同。 如果你添加System.out.println(Thread.currentThread().getName()你会看到它在Runnablerun()方法中打印出main()AWT-EventQueue-0 main()

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