我最近发现了一个示例代码:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}createAndShowGUI()方法打开用户界面窗口。然后,我试图按以下方式修改代码:
public static void main(String[] args) {
createAndShowGUI();
}这两个版本都运行得同样好。有什么关系?
发布于 2013-10-03 19:04:35
99%的情况下,这两种代码都能工作。
但是,Swing的设计使得对Swing组件的所有更新都应该在事件分发线程(,EDT)上完成。有关更多信息,请阅读关于并发性的Swing教程。
问题是,1%的情况下,它可能不起作用。您不想浪费时间来调试随机问题。
发布于 2013-10-03 19:05:22
SwingUtilities.invokeLater确保代码在事件调度线程(EDT)上执行。Swing是单线程的,所有组件的实例化和显示都应该发生在EDT上.事情可能不是这样的,但你可能会遇到问题。
发布于 2013-10-03 19:07:13
Swing具有基于单线程事件环的设计,并不是线程安全的,只有线程安全部分是用于将控制传递到Swing事件循环的一组invokeXXX()方法。
您的“损坏”代码工作得很好,因为没有任何其他代码试图同时从事件循环中接触到Swing数据结构的同一部分。
https://stackoverflow.com/questions/19167154
复制相似问题