事件隊列:在計算機(jī)數(shù)據(jù)結(jié)構(gòu)中护锤,隊列是一個特殊的數(shù)據(jù)結(jié)構(gòu)官地。其一、它是線性的烙懦;其二驱入、元素是先進(jìn)先出的,也就是說進(jìn)入隊列的元素必須從末端進(jìn)入氯析,先入隊的元素先得到執(zhí)行亏较,后入隊的元素等待前面的元素執(zhí)行完畢出隊后才能執(zhí)行,隊列的處理方式是執(zhí)行完一個再執(zhí)行下一個掩缓。
而Swing的事件隊列就類似(基本原理相似雪情,但是Swing內(nèi)部實現(xiàn)會做些優(yōu)化)于上述的事件隊列,說它是單線程圖形工具包指的是僅有單一消費者你辣,也就是常說的事件分發(fā)線程(EDT)巡通,一般來講,除非你的應(yīng)用程序停止舍哄,否則EDT會永不間斷地徘徊在處理請求與等待請求之間扁达。下圖是Swing事件隊列的實現(xiàn)機(jī)制:
EventDispatchThread.jpg
和其他很多桌面API一 樣,Swing將GUI請求放入一個事件隊列中執(zhí)行蠢熄。
EventDispath Thread:EventQueue的派發(fā)機(jī)制由單獨的一個線程管理跪解,這個線程稱為事件派發(fā)線程(EDT)
EDT要處理所有GUI操作,它是職責(zé)分明且非常忙碌的签孔。也就是說你要記住兩條原則:一叉讥、職責(zé)分明,任何GUI請求都應(yīng)該在EDT中調(diào)用饥追。二图仓、需要處理的GUI請求非常多,包括窗口移動但绕、組件自動重繪救崔、刷新,它很忙捏顺,所以任何與GUI無關(guān)的處理不要由EDT來負(fù)責(zé)六孵,尤其是I/O這種耗時的操作。