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

Rob*_*Rob 22 java swing program-entry-point invokelater swingutilities

经过多年的Java编程,我总是习惯于创建main()这样的方法:

public static void main(String[] args) 
{
    runProgram();
}
Run Code Online (Sandbox Code Playgroud)

但是最近我从Web上学习了一些代码并且有时看到这个代码而不是main()上面的常规用法:

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

我只是想知道:

  • 为什么要使用这个而不是通常的main()方式?当我试一试时,我看不出有任何区别.
  • 这两种方式有什么区别?

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

Rei*_*eus 23

文档解释了原因.来自初始线程

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

并从事件派遣线程

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


sol*_*4me 13

因为VM启动的线程"main"不是事件派发线程.