MBy*_*ByD 11 java swing multithreading
在这里作为答案给出的许多Swing片段中,有一个SwingUtilities#invokeLater来自该main方法的调用:
public class MyOneClassUiApp {
private constructUi() {
// Some Ui related Code
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MyOneClassUiApp().constructUi();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
但根据Threads and Swing的文章,从主线程构造UI是安全的:
一些方法是线程安全的:在Swing API文档中,线程安全方法用以下文本标记:
虽然大多数Swing方法都不是,但这种方法是线程安全的.
应用程序的GUI通常可以构造并显示在主线程中:只要没有实现组件(Swing或其他),以下典型代码是安全的:
public class MyApplication {
public static void main(String[] args) {
JFrame f = new JFrame("Labels");
// Add components to
// the frame here...
f.pack();
f.show();
// Don't do any more GUI work here...
}
}
Run Code Online (Sandbox Code Playgroud)
那么,是否有一个真正的(线程安全)理由在main中构建UI SwingUtilities#invokeLater,或者这只是一种习惯,要记住在其他情况下执行它?
tra*_*god 16
" Swing单线程规则:应仅从事件派发线程创建,修改和查询Swing组件和模型." - Java Concurrency in Practice,也在这里和这里讨论.如果你不遵循这个规则,那么你就不能可靠地构建,修改或查询可能已经认为你的任何组件或模型没有遵循规则.程序似乎可以正常工作,但只能在不同的环境中神秘地失败.由于违规行为可能不明确,请使用此处提到的方法之一验证是否正确使用.
| 归档时间: |
|
| 查看次数: |
12266 次 |
| 最近记录: |