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

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

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

但是最近我从网上研究了一些代码,有时看到这个而不是上面的通常用法:main()

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

我只想知道:

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

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


答案 1

文档解释了原因。从初始线程

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

和从事件调度线程

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


答案 2

因为 VM 启动的线程“main”不是事件调度线程


推荐