在Java中Swing是线程不安全的,是单线程的设计,只能从事件派发线程访问将要在屏幕上绘制的Swing组件,不能在事件派发线程以外的线程中更新Swing组件。事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。
需要在非事件派发线程中更新Swing组件时,可以调用SwingUtilities.invokeLater()和SwingUtilities.invoteAndWait(),它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。invokeLater是异步操作,而invoteAndWait是同步阻塞的