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