Swing是线程不安全的,也就是说只能从单线程访问Swing组件。Swing单线程设计的结果,使得大多数情况下只能从事件派发线程(事件派发线程是调用paint和update等回调方法的线程,而且还是事件监听器接口中定义的事件处理方法,如actionPerformed方法。)中访问将要在屏幕上绘制的Swing组件。
但是,有时可能需要从事件派发线程以外的线程中更新Swing组件。比如你设计一个查询数据库的程序,当点查询按钮时,可能要执行一段比较耗时,假设你是在按钮的actionPerformed方法中处理查询的,那么这时候按钮一直按下状态,而且在事件处理方法返回之前,其他的事件不能派发。如果在独立的线程上执行象数据库查询等耗时的操作可能更好,这将允许立即更新用户界面和释放事件派发线程去派发别的事件。
SwingUtilities.invokeLater和invokeAndWait就是解决上述问题,它使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。也就是允许事件派发线程调用另一个线程中的任意一个代码块。