在理解SwingUtilities类中的.invokeLater()和invokeAndWait()两种方法之前,需要先了解清楚Swing线程机制。Swing程序通常包括三种类型的线程:①初始化线程(Initial Thread);②任务线程(Work Thread);③事件调度线程(Event Dispatch Thread,EDT)。
初始化线程主要负责启动程序的UI界面,一旦UI界面启动完成,初始化线程的工作就结束了,每个程序都是从main方法开始执行,该方法一般就是运行在初始化线程上。工作线程主要负责执行和界面无直接关系的耗时任务和输入/输出密集型操作,任何高染或延迟UI事件的处理都会由该线程完成。EDT主要负责绘制和更新界面,并响应用户的输入,每个Swing程序都会有一个EDT,通过EDT管理一个事件队列,用户每次对界面的更新请求(如键盘、鼠标移动等事件)都会排到事件队列中等待EDT的处理,EDT会将队列中的事件按照顺序派发给相应的事件监听器,并且调用事件监听器中的回调函数。
通过上面的内容可以了解到EDT管理了一个事件队列,并且它们是按照顺序派发的。由于事件派发是单线程的操作,所以只有等待前面事件监听器的回调函数执行完毕,才能够执行组件更新的操作以及继续派发后面的事件。这样导致的一个后果就是:当在一个事件监听回调函数中做了耗时的操作就会导致UI界面因此停住,并且UI界面上所有的控件失效(不可触发)。针对这样的问题,我们想到的解决办法就是将事件处理函数中的耗时