【发布时间】:2011-11-01 16:27:28
【问题描述】:
在此处作为答案给出的许多 Swing sn-ps 中,有一个来自 main 方法的对 SwingUtilities#invokeLater 的调用:
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();
}
});
}
}
但是根据Threads and Swing article,从主线程构造UI是安全的:
一些方法是线程安全的:在 Swing API 文档中, 线程安全方法标有以下文本:
这个方法是线程安全的,虽然大多数 Swing 方法不是。
应用程序的 GUI 通常可以构建并显示在主界面中 thread:下面的典型代码是安全的,只要没有组件 (摇摆或其他)已实现:
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...
}
}
那么,通过SwingUtilities#invokeLater 在 main 中构造 UI 是否有真正的(线程安全)理由,或者这只是一种习惯,要记住在其他情况下这样做?
【问题讨论】:
-
是的,你必须在所有情况下都包装 main 方法,是的,大多数 JComponents 都是线程安全的,但对于它们的嵌套和继承方法无效,仅此而已,抱歉,也许这个
. -
另见Q&A,它检查“为什么 GUI 是单线程的?”
标签: java multithreading swing