Swing 不是线程安全的
1、UI线程是Event Dispatcher Thread,负责GUI工作。
2.尝试在 UI 线程之外使用非 UI 线程。
3. 是的,当然你可以从 UI 线程中触发一个线程,但建议将其置于 UI 线程之外,否则 GUI 可能看起来没有响应。
(即负责UI工作的UI线程的非UI线程OUT上的非UI工作)
4.还有一种swing方式...使用SwingWorker,它处理UI和Non-UI线程之间的同步。
编辑部分:
// 请注意,直接在框架/JFRAME 上添加组件并不好,但我这样做只是为了说明我的意思。
public class MyClass extends JFrame{
private final JButton b;
public MyClass(){
this.setSize(300,300);
this.setComponent();
this.setHandler();
}
public void setComponent(){
b = new JButton("Click");
this.add(b);
}
public void setHandler(){
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// Do whatever you want...
}
});
}
public static void main (String[] args) {
EventQueue.invokeLater(new Runnable(){ // UI THREAD
public void run(){
MyClass s = new MyClass();
s.setVisible(true);
}
});
}
}
Main 方法在 Swing 中是短暂的,main method() 将 GUI 的构建调度到事件调度线程 (EDT),然后退出。所以它的 EDT 有责任处理 GUI。因此,始终建议让非 UI 线程上的非 UI 工作远离 EDT。