Gam*_*anA 4 java swing multithreading
我是Java的新手,在阅读了很多关于线程和swing的文章后,我明白所有Swing方法的调用都应该在EDT上完成,因为Swing不是线程安全的.但是,在阅读有关EDT之前,我已经编写了几个相当长的Swing应用程序.我的所有应用程序都运行得很好.所以我的问题是我的Swing应用程序默认运行在EDT上,还是在不同的线程上运行,我很幸运,没有任何问题?例如,如果我将JButton添加到JPanel或JFrame,或者我只是调用JTextField Field.setText(),那么默认情况下这些操作是否会在EDT上运行?如果答案是否定的,那么我是否必须通过调用显式发送我的所有Swing组件的方法实现以在EDT上运行SwingUtilities.invokeLater()
谢谢
记住对象不在线程上,只在线程上执行方法.
来自swing组件的所有动作(通过听众)自动在EDT上运行.
例如,您单击一个按钮,该onClicked()功能将在EDT上运行,因此您无需执行任何操作.
如果你没有显式创建任何线程,你的基本应用程序将有一个主线程和一个EDT(以及许多其他线程,你不会意外地执行你的代码,直到你开始使用额外的框架).
你必须手动完成的事情是在EDT上构建GUI.正如您在此处所见,这可以在主线程中完成,如下所示:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyWindow window = new MyWindow ();
window.setVisible(true);
}
});
Run Code Online (Sandbox Code Playgroud)
如果您未能正确使用EDT.一切似乎都可以正常工作,但偶尔你会得到非常奇怪的行为(因为两个线程将做的事情而不是一个).
总而言之,您必须使用invokeLater(),或者在invokeNow()以下情况下使用某些例外情况:
这个问题包含一些可以帮助您自动检测错误的工具(尽管不是全部).
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |