介紹SwingWorker任務
SwingWorker任務隊列
RemoteTable用一個QueuedExecutor調度它的SwingWorker任務,QueuedExecutor在單個線程中順序執行所有的任務。(QueuedExecutor是DougLea的util.concurrent包的一部分,請參見后面的“參考資料”部分。)遠程模型用RMI回調操作通知它的監聽器。
為了支持可視的反饋,RemoteTable發送Task事件給注冊的Task監聽器。在任務進入調度時,監聽器的taskStarted()被調用,taskEnded()在任務完成時被調用。客戶端演示程序使用這些事件來啟動或停止一個小動畫并更新狀態來。
執行次序
表示的是單元格的更新過程。執行過程的開始和結束都位于左邊的事件派發線程。SwingWorker任務則在右邊的executor的線程中執行。Worker的finished()方法的執行過程沒有表示出來。
SwingWorker任務簡化
簡單起見,遠程模型并沒有對互相沖突的編輯提供保護。所以在同一時刻僅能有一個編輯器在運行。(并發編輯可以用添加請求ID(requestIDs)的方法來實現。)
所作的另一項簡化決定是客戶端和服務器必須預先對表的列結構協商好。換句話說,服務器性客戶端提供行數據,而客戶端必須已經知道他們要處理的是什么表。演示用的客戶端用DefaultModelTemplate來預先定義了各列的名稱和類,來確定哪個單元格可以被編輯。(在演示程序中,前兩列是不可編輯的。)
本節的余下部分闡述了類結構和實現。如果不想了解這個演示程序中所用的修訂版的SwingWorker,你可以跳過去。“下載”一節解釋了如何下載并運行這個演示程序。
SwingWorker任務實現
遠程模型實現了RemoteTableModel接口,這個接口和AbstractTableModel很相似,除了它的所有方法都會拋出異常。要啟動一個客戶端,遠程表模型發送一個完全更新事件給客戶端已注冊的的監聽器。
RemoteTableModelAdapter配接任意的TableModel到一個RemoteTableModel。演示程序中的表模型取自TheJavaTutorial,但插入了一些延遲來模擬實際情況。遠程表模型事件包含已更新的單元格的值。
RemoteTable 組件用一個DefaultRemoteTableModelListener來接受來自遠程模型的回調。這個監聽器會在事件派發線程中更新本地模型。因為遠程模型可能要通知插入或刪除某些行,所以監聽器要求本地模型支持插入和刪除操作,DefaultTableModel滿足這個要求。
【編輯推薦】