什么是SwingUtilities.invokeLater

116*_*684 13 java swing invokelater swingutilities

可能重复:
SwingUtilities.invokeLater做什么?
SwingUtilities.invokeLater

我已经看过几百次这段代码了:

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

现在我的问题是:做invokeLater()什么?如果我只是在主线程中创建并显示我的GUI,会发生什么样的坏事?

Kum*_*tra 11

1. Event Dispatcher Thread是GUI线程.

2.如果你是在谈论main() method...然后它不是长期生活在Java GUI中. main()在EDT退出后调度GUI结构后的方法,现在是处理GUI的EDT.

3. invokeLater表示当事件放入Event Dispatcher Queue时,此调用将立即返回,并且run()方法将异步运行...

  • 嗯......请考虑使用技术词汇,这样我们都可以理解你的真正含义(_不长期生活_或_run同时_不是,这意味着错误或暧昧;-) (3认同)

Mar*_*nik 5

Swing不是线程安全的,并且必须在Event Dispatch Thread中执行对Swing对象的所有更改.如果您尝试在其外部运行代码,您将得到未指定的行为,这可能会在某些时候变得奇怪.

相比之下,Eclipse使用的SWT/JFace GUI框架在每个公共入口点上断言正确的线程.

  • *"如果你试图在它之外运行你的代码,你只会得到一个例外,因为在任何进一步的动作之前检查调用线程"*?在EDT之外运行UI东西可能会产生奇怪的行为,但不一定会抛出异常. (4认同)

nul*_*ent 2

如果您在遵循准则的情况下从 EDT 进行更新,则不会发生任何不良情况。

那是...

如果从事件调度线程(例如,从 JButton 的 ActionListener)调用 invokeLater,则 doRun.run() 仍将被推迟,直到处理完所有待处理事件。

来源

如果不是这种情况,invokeLater()则需要。

它调度Runnable将在 EDT(事件调度线程)上执行的任务。

  • -1表示_没什么不好_(不幸的是今天的投票被淘汰;-)请编辑您的答案以正确解释您的真正含义。 (6认同)
  • 大多数时候,您都是通过“线程”完成所有事情。你的意思是“不是主线程”吗? (2认同)