为什么要在主要方法中使用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的线程。