官术网_书友最值得收藏!

5.2 Two-phase Termination模式的架構

Two-phase Termination模式的主要參與者有以下幾種,其類圖如圖5-1所示。

圖5-1 Two-phase Termination模式的類圖

? ThreadOwner:目標線程的擁有者。在Java語言中,并沒有線程擁有者的概念,但是線程的背后是其要處理的任務或者其所提供的服務,因此我們不能在不清楚某個線程具體要做什么的情況下貿(mào)然將其停止。一般地,我們可以將目標線程的創(chuàng)建者視為該線程的擁有者,并假定其“知道”目標線程的工作內(nèi)容,以及可以安全地停止目標線程。

? Terminatable:可停止線程的抽象,其主要方法及職責如下。

? terminate:請求目標線程停止。

? AbstractTerminatableThread:可停止的線程,其主要方法及職責如下。

? terminate:設置線程停止標志,并發(fā)送停止“信號”給目標線程。

? doTerminate:留給子類實現(xiàn)的線程停止時所需的一些額外操作,如目標線程代碼中包含Socket I/O,子類可以在該方法中關閉Socket以快速停止線程,而不會使目標線程等待I/O完成后才能偵測到線程停止標志。

? doRun:線程處理邏輯方法,留給子類實現(xiàn)的線程的處理邏輯。相當于Thread.run,只不過在該方法中無須關心停止線程的邏輯,因為這個邏輯已經(jīng)被封裝在AbstractTerminatableThread的run方法中了。

? doCleanup:留給子類實現(xiàn)的線程停止后可能需要的一些清理動作。

? TerminationToken:線程停止標志。toShutdown用于指示目標線程可以停止了。reservations可用于反映目標線程還有多少未完成的任務,以實現(xiàn)等待目標線程處理完其任務后再行停止。

? ConcreteTerminatableThread:由應用自己實現(xiàn)的AbstractTerminatableThread參與者的實現(xiàn)類。該類需要實現(xiàn)其父類的doRun抽象方法,在其中實現(xiàn)線程的處理邏輯,并根據(jù)應用的實際需要覆蓋(Override)其父類的doTerminate方法、doCleanup方法。

準備階段的序列圖如圖5-2所示。

圖5-2 準備階段的序列圖

第1步:客戶端代碼調用線程擁有者的shutdown方法。

第2步:shutdown方法調用目標線程的terminate方法。

第3、4步:terminate方法將terminationToken的toShutdown標志變量設置為true。

第5步:terminate方法調用由AbstractTerminatableThread子類實現(xiàn)的doTerminate方法,使得子類可以為停止目標線程做一些其他必要的操作。

第6步:若terminationToken的reservations屬性值為0,則表示目標線程沒有未處理完畢的任務或者ThreadOwner在停止線程時不關心其是否有未處理完畢的任務。此時,terminate方法會調用目標線程的interrupt方法。

第7步:terminate方法調用結束。

第8步:shutdown方法調用返回,此時目標線程可能仍然在運行。

執(zhí)行階段由目標線程的run方法來檢查terminationToken的toShutdown屬性、reservations屬性的值,并捕獲由interrupt方法調用拋出的相關異常,以決定是否停止線程。在線程停止前,由AbstractTerminatableThread子類實現(xiàn)的doCleanup方法會被調用。

主站蜘蛛池模板: 晋宁县| 盐池县| 濮阳县| 荥经县| 旺苍县| 葵青区| 兴文县| 瑞金市| 吕梁市| 民丰县| 峡江县| 三穗县| 松江区| 咸阳市| 乌拉特中旗| 白沙| 贡山| 达拉特旗| 天等县| 额尔古纳市| 江山市| 额敏县| 连南| 高邮市| 佳木斯市| 揭西县| 崇义县| 邳州市| 成安县| 新疆| 彰武县| 娄烦县| 四会市| 眉山市| 宁津县| 景宁| 阳西县| 齐齐哈尔市| 镶黄旗| 抚宁县| 犍为县|