1. 程式人生 > >Java多執行緒之"事件分發執行緒"----Event Dispatch Thread

Java多執行緒之"事件分發執行緒"----Event Dispatch Thread

當執行GUI小程式(Applet)或應用程式(Application)時,main()方法中的程式碼會
建立一個GUI並設定事件控制代碼.當呼叫Frame,Dialog,Window的setVisible(true)或
瀏覽器顯示Applet時,我們就是在和GUI互動.

  問題是你的main()可能不會只停留在使用者介面上,它可能會作一些其他方法.比
如計算
PI直到小數點後40000位.如果使用者在和GUI互動之前要等待一段漫長的時間的話,
他們可能就會退出。
  所以AWT庫實現了監控GUI互動的執行緒.這個執行緒實際上就是迴圈檢查系統事件隊
列(System Event Queue)是否有滑鼠點選,鍵盤按下或其他系統事件(也可以把自
己的事件加入系統事件佇列,這就是將在下一片中提到的).這個執行緒就是事件分發
執行緒(Event Dispatch Thread),它是java.awt.EventDispatchThread的一個例項
.事件分發執行緒是Swing和AWT中最重要的,在繪製,更新和顯示元件和受控的應用程
序方面扮演這關鍵的角色.和這個執行緒緊密相關的是一個FIFO事件的佇列----系統
事件佇列,它是java.awt.EventQueue的一個例項.每個事件都是按順序一個一個的
執行的,這是為了避免在元件重繪的過程中元件的狀態發生變化.我們一定要小心
不要再事件分發執行緒之外分發一個事件.例如,在另外執行的執行緒中直接呼叫fire
XX()方法是不安全的.另外,應當儘量使事件控制代碼和繪製方法儘可能的短小精悍,否
則系統的反應會變得不靈敏,有些時候甚至看起來象是宕機了.

  事件分發執行緒(Event Dispatch Thread)從系統事件佇列取出並檢測對其採取何
種處理.如果是對一個元件的點選,就為這個元件呼叫處理控制代碼.接下來,那個元件
再發送其他事件.例如,假設你單擊了一個JButton,事件分發執行緒傳遞一個滑鼠單
擊到JButton, JButton把它解釋成一個"按鈕按下",並呼叫它的actionPerformed
方法.所有註冊過的監聽器的actionPerformed方法都會得到呼叫.

  javax.swing.EventLisenerList是一個包含XXEvent/XXListener對的陣列.所有
的元件(JComponent)和模型(model)都有自己的EventListenerList陣列.當Liste
ner被加入或刪除的時候,新的EventListenerList陣列會通過System.arrayCopy(
)被建立.之所以不使用Vector而代之以陣列是因為考慮到執行效率的原因.

  AWT執行緒(事件分發執行緒)也負責GUI的重繪.任何時候呼叫了repaint方法,一個刷
新請求就被放入事件佇列.只要AWT執行緒看到重新整理請求,它就會檢查GUI的破壞區和
被標記為invalid的元件,然後呼叫適當的方法輸出GUI和需要重繪的元件. 

  所有的AWT元件都是執行緒安全的,線上程安全的方式下,當你呼叫一個Label的se
tText()方法時,顯示是同步的,你不會看到一半是老的內容一半是新的內容的情況
.而swing元件不是執行緒安全的.你必須確保任何對元件的更改都通過事件分發執行緒
處理.如果一個執行緒即更新又顯示一個元件,你必須保證他們的一致性.:-)

Please wait for the next article :

  Java多執行緒之建立自己的執行緒安全方法----Build Our Own Thread-safe Meth
ods

--