为什么要使用SwingUtilities.invokeLater的主要方法是什么?(Why to u

2019-07-21 05:29发布

经过多年的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()方法吗? 我看不出有什么区别时,我给它一个尝试。
  • 什么是这两种方式之间的区别?

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

Answer 1:

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

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

从事件调度线程

有些Swing组件的方法都在API规范标有“线程安全的”; 这些可以从任何线程调用安全。 所有其他Swing组件的方法必须从事件派发线程调用。 无视这个规则可以正常工作的大部分时间,但受制于难以重现不可预知的错误程序。



Answer 2:

因为线程“主要”由VM开始不是事件调度线程



Answer 3:

从API的一些Swing组件不是线程安全的,这意味着它们可能会导致像僵局一些问题,所以它能够更好地创建和使用由摆动而不是从主线程或任何其他提供事件调度线程进行更新,例如摆动组件线程创建主体。



文章来源: Why to use SwingUtilities.invokeLater in main method?