可能重复:
What does SwingUtilities.invokeLater do?
SwingUtilities.invokeLater
我已经看过几百次这段代码:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
现在我的问题是:invokeLater()
做了什么?如果我只是在主线程中创建并显示我的GUI,会发生什么样的坏事?
答案 0 :(得分:10)
1。 Event Dispatcher Thread
是GUI主题。
2. 如果您正在谈论main() method
...那么它不会长期存在于Java Gui 中。
在EDT退出时安排GUI构建后的main()
方法,现在是处理GUI的 EDT。
3。 invokeLater
表示此次调用将立即返回,因为事件已置于事件调度程序队列中,run()
方法将< strong>异步运行......
答案 1 :(得分:5)
Swing不是线程安全的,并且必须在Event Dispatch Thread中执行对Swing对象的所有更改。如果你试图在它之外运行你的代码,你会得到未指定的行为,这可能会在某些时候变得奇怪。
相反,Eclipse使用的SWT / JFace GUI框架在每个公共入口点上断言正确的线程。
答案 2 :(得分:3)
如果您在跟踪guidelines时从EDT更新它,那么不会发生任何不良后果。
那是......
如果从事件调度线程调用invokeLater - for 例如,从JButton的ActionListener - doRun.run()仍然会 被推迟到所有未决事件都被处理完毕。
如果不是这种情况,则需要invokeLater()
。
它安排将在EDT(事件调度线程)上执行的Runnable
。