为什么要在主要方法中使用SwingUtilities.invokeLater?

经过多年的Java编程,我总是用这种方式创build我的main()方法:

 public static void main(String[] args) { runProgram(); } 

但是最近我研究了一些来自Web的代码,有时会看到这个代码,而不是上面常用的main()方法:

 public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { runProgram(); } }); } 

我只是想知道:

  • 为什么使用这个而不是通常的main()方法? 当我尝试一下时,我看不出有什么不同。
  • 这两种方式有什么区别?

感谢您阅读我和您的答案。

文档解释了原因。 从最初的主题

为什么初始线程不是简单地创buildGUI本身? 因为创build或与Swing组件交互的几乎所有代码都必须在事件派发线程上运行。

并从事件调度线程

某些Swing组件方法在API规范中标记为“线程安全”; 这些可以从任何线程安全地调用。 所有其他Swing组件方法必须从事件派发线程中调用。 忽略此规则的程序可能在大多数情况下正常运行,但会受到难以重现的不可预知的错误的影响。

因为由VM启动的线程“main”不是事件派发线程

从API的一些Swing组件不是线程安全的,这意味着它们可能会导致一些像死锁一样的问题,所以最好使用Swing提供的Event Dispatcher线程来创build和更新这样的swing组件,而不是从主线程或其他从主创build的线程。