猿问

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

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

经过多年的Java编程,我总是习惯于创建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()方式?当我试一试时,我看不出有任何区别。

  • 这两种方式有什么区别?

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


呼如林
浏览 835回答 3
3回答

梵蒂冈之花

文档解释了原因。来自初始线程为什么初始线程不是简单地创建GUI本身?因为几乎所有创建Swing组件或与Swing组件交互的代码都必须在事件派发线程上运行。并从事件派遣线程一些Swing组件方法在API规范中标记为“线程安全”; 这些可以从任何线程安全地调用。必须从事件派发线程调用所有其他Swing组件方法。忽略此规则的程序可能在大多数情况下正常运行,但会遇到难以复制的不可预测的错误。

MM们

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

侃侃无极

来自API的一些Swing组件不是线程安全的,这意味着它们可能会导致一些问题,比如死锁,所以最好通过使用Swing提供的Event调度程序线程创建和更新这样的swing组件,但不能从主线程或其他任何线程创建和更新从main创建的线程。
随时随地看视频慕课网APP

相关分类

Java
我要回答