介紹SwingWorker任務(wù)
SwingWorker任務(wù)隊(duì)列
RemoteTable用一個(gè)QueuedExecutor調(diào)度它的SwingWorker任務(wù),QueuedExecutor在單個(gè)線程中順序執(zhí)行所有的任務(wù)。(QueuedExecutor是DougLea的util.concurrent包的一部分,請(qǐng)參見(jiàn)后面的“參考資料”部分。)遠(yuǎn)程模型用RMI回調(diào)操作通知它的監(jiān)聽(tīng)器。
為了支持可視的反饋,RemoteTable發(fā)送Task事件給注冊(cè)的Task監(jiān)聽(tīng)器。在任務(wù)進(jìn)入調(diào)度時(shí),監(jiān)聽(tīng)器的taskStarted()被調(diào)用,taskEnded()在任務(wù)完成時(shí)被調(diào)用。客戶端演示程序使用這些事件來(lái)啟動(dòng)或停止一個(gè)小動(dòng)畫(huà)并更新?tīng)顟B(tài)來(lái)。
執(zhí)行次序
表示的是單元格的更新過(guò)程。執(zhí)行過(guò)程的開(kāi)始和結(jié)束都位于左邊的事件派發(fā)線程。SwingWorker任務(wù)則在右邊的executor的線程中執(zhí)行。Worker的finished()方法的執(zhí)行過(guò)程沒(méi)有表示出來(lái)。

SwingWorker任務(wù)簡(jiǎn)化
簡(jiǎn)單起見(jiàn),遠(yuǎn)程模型并沒(méi)有對(duì)互相沖突的編輯提供保護(hù)。所以在同一時(shí)刻僅能有一個(gè)編輯器在運(yùn)行。(并發(fā)編輯可以用添加請(qǐng)求ID(requestIDs)的方法來(lái)實(shí)現(xiàn)。)
所作的另一項(xiàng)簡(jiǎn)化決定是客戶端和服務(wù)器必須預(yù)先對(duì)表的列結(jié)構(gòu)協(xié)商好。換句話說(shuō),服務(wù)器性客戶端提供行數(shù)據(jù),而客戶端必須已經(jīng)知道他們要處理的是什么表。演示用的客戶端用DefaultModelTemplate來(lái)預(yù)先定義了各列的名稱(chēng)和類(lèi),來(lái)確定哪個(gè)單元格可以被編輯。(在演示程序中,前兩列是不可編輯的。)
本節(jié)的余下部分闡述了類(lèi)結(jié)構(gòu)和實(shí)現(xiàn)。如果不想了解這個(gè)演示程序中所用的修訂版的SwingWorker,你可以跳過(guò)去?!跋螺d”一節(jié)解釋了如何下載并運(yùn)行這個(gè)演示程序。

SwingWorker任務(wù)實(shí)現(xiàn)
遠(yuǎn)程模型實(shí)現(xiàn)了RemoteTableModel接口,這個(gè)接口和AbstractTableModel很相似,除了它的所有方法都會(huì)拋出異常。要啟動(dòng)一個(gè)客戶端,遠(yuǎn)程表模型發(fā)送一個(gè)完全更新事件給客戶端已注冊(cè)的的監(jiān)聽(tīng)器。
RemoteTableModelAdapter配接任意的TableModel到一個(gè)RemoteTableModel。演示程序中的表模型取自TheJavaTutorial,但插入了一些延遲來(lái)模擬實(shí)際情況。遠(yuǎn)程表模型事件包含已更新的單元格的值。
RemoteTable 組件用一個(gè)DefaultRemoteTableModelListener來(lái)接受來(lái)自遠(yuǎn)程模型的回調(diào)。這個(gè)監(jiān)聽(tīng)器會(huì)在事件派發(fā)線程中更新本地模型。因?yàn)檫h(yuǎn)程模型可能要通知插入或刪除某些行,所以監(jiān)聽(tīng)器要求本地模型支持插入和刪除操作,DefaultTableModel滿足這個(gè)要求。
【編輯推薦】






















