- Java多線程編程實戰(zhàn)指南:設計模式篇(第2版)
- 黃文海
- 914字
- 2021-10-15 19:24:59
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方法會被調用。
- DB2 V9權威指南
- Learning Scala Programming
- C++程序設計教程
- Power Up Your PowToon Studio Project
- C# Programming Cookbook
- Three.js開發(fā)指南:基于WebGL和HTML5在網(wǎng)頁上渲染3D圖形和動畫(原書第3版)
- C語言程序設計
- Bootstrap Essentials
- 微信小程序入門指南
- WebRTC技術詳解:從0到1構建多人視頻會議系統(tǒng)
- Machine Learning in Java
- Unity 3D腳本編程:使用C#語言開發(fā)跨平臺游戲
- MySQL程序員面試筆試寶典
- 區(qū)塊鏈國產(chǎn)化實踐指南:基于Fabric 2.0
- 交互設計師成長手冊:從零開始學交互