基于效率和用户可扩展性的考虑,swing被设计成非线程安全的。swing程序中有两个线程被先后创建main主线程事件分派线程,main可能很快就退出了,swing事件响应代码在事件分派线程中执行。

    若需要完成一个耗时的任务,则可以启动一个新线程来处理。但是不能在新线程中直接操作swing组件!这可能导致swing崩溃。一种情况就是我们需要在更新界面的进度条或标签等。处理的办法是使用java.awt.EventQueue,将更新界面的代码放入static的invokeLater或invokeAndWait方法中。如更新一个标签[1]

   
   
   
   
  1. EventQueue.invokeLater(new Runnable(){ 
  2.      public void run(){ 
  3.            lable.setText(percentage + "% complete"); 
  4.      } 
  5. }); 

这样就将事件发布到事件队列中。没有新的线程被创建!

invokeLater方法直接返回,run()被异步执行。

invokeAndWait则直到run()执行结束返回。

 

[1]Java2核心技术卷2高级特性7th