java Swing图形程序一般有三个线程:

1.主线程:这是必须的, 没主线程序怎么运行

2.任务管理线程:打杂的,此线程在背后默默的打杂,对程序员来说不可见。它将事件由操作系统转换成java awt事件,并将事件放入到事件队列当中,以供EDT来处理。

3.EDT:事件分配线程。这是接触ui组件的唯一线程,负责所有的ui组件更新等,并且分配事件到具体的组件中。

每个swing程序都有个事件队列,Swing程序只有一个EDT,该线程负责GUI组件的绘制和更新,通过调用程序的事件处理器来响应用户交互。所有事件都是先放入事件队列里,然后由EDT依次取出处理,程序 同UI组件和其基本数据模型的交互只允许在EDT上进行,所有运行在EDT上的任务应该尽快完成,以便UI能及时响应用户输入。Swing编程时应该注意以下两点:
1.对组件的处理只能交给EDT。
2.不要在EDT中处理耗时的操作,那会使及面失去相应而”卡死“

即使是组件的初始化也最好放在EDT中处理,虽然从主线成直接初始化组件发生的错误概率很小,但还是要避免。

下面平时大家用得比较多的不正确的ui组件初始化方式:

public class MainFrame extends javax.swing.JFrame {
  ...

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new MainFrame().setVisible(true);
      }
    });
  }
}
下面是正确的方式:

public class MainFrame extends javax.swing.JFrame {
  ...

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new MainFrame().setVisible(true);
      }
    });
  }
}
上述的SwingUtilites.invokeLater也可有EventQueue.invokeLater代替,这两个方法都是正确的,选择任何一个都可以。实际上,SwingUtilities版只是一个薄薄的封装方法,它直接调用 EventQueue.invokeLater。因为Swing框架本身经常调用SwingUtilities,使用SwingUtilities可以减 少程序引入的类。

第一条规则同通常称为单一线程规则,在任何非EDT线程中都不该接触swing组件。这两条规则看似是矛盾的,既然将耗时的操作放入其他其他线程,那么当耗时操作完成时如何将结果更新到swing组件当中去?因为不能在其他线程中接触swing组件的。其实想想也不难,既然EDT本质上是从事件队列中拿出事件来处理的,那么只要能在其他线程中把耗时操作完成以后再把更细ui组件的代码封装放到事件队列中就行了,到时EDT自然会从事件队列取出代码执行用以达到更新的目的,这样两条规则都满足了。其实在任何线程中,可以使用两种方法想事件队列添加任意的动作。即调用SwingUtilites类(或者EventQueue类也是一样)invokeLater或者invokeAndWait两个静态方法向事件队列添加任务。

应该将Swing更新代码放入到实现Runnable接口的类的run方法中。然后,创建该类的一个对象,将其传递给静态的invokeLater或者invokeAndWait静态方法。如下:

SwingUtilites.invokeLater(new Runnable(){

  public void run(){

    update code...

  }

}

);

当任务放入到事件队列后,invokeLater方法立即返回,run方法到时会在EDT中异步执行,invokeAndWait方法会一直等待知道run方法确实被执行过才会返回,在run方法完成之前调用invokeAndWait方法的线程将会阻塞。这两种方法与创建线程不同,run方法不会在新线程中执行,而是到时由EDT调用,并没有创建新的线程。

当要处理耗时操作时应该采取上述方法来更新swing组件,但创建了方便的SwingWorker类可以更方便的完成耗时任务。具体可参考http://java.sun.com/developer/technicalArticles/javase/swingworker/,这是sun公司的一篇介绍SwingWorker类的文章很详细,中文翻译的可查看http://blog.sina.com.cn/s/blog_4b6047bc010007so.html