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

第5章
Two-phase Termination(兩階段終止)模式

5.1 Two-phase Termination模式簡介

停止線程是一個目標簡單而實現起來卻不那么簡單的任務。首先,Java沒有提供直接的API用于停止線程[1]。此外,停止線程還有一些額外的細節需要考慮,如待停止的線程處于阻塞(如等待獲得鎖)或者等待(等待其他線程)狀態、尚有未處理完畢的任務等。

Two-phase Termination模式通過將停止線程這個動作分解為準備階段和執行階段這兩個階段,提供了一種通用的用于優雅[2]地停止線程的方法。

準備階段 該階段的主要動作是“通知”目標線程(待停止的線程)準備停止。這一步會設置一個標志變量用于指示目標線程可以準備停止了。但是,由于目標線程可能正處于阻塞狀態(等待獲得鎖)、等待狀態(如調用Object.wait)或者I/O等待(如InputStream.read)等狀態,即便設置了這個標志變量,目標線程也無法立即“看到”這個標志變量而做出相應的動作。因此,這一階段還需要通過調用目標線程的interrupt方法,以期望目標線程能夠通過捕獲相關的異常而偵測到該方法調用,從而中斷其阻塞狀態、等待狀態。對于能夠對interrupt方法調用做出響應的方法(參見表5-1),目標線程代碼可以通過捕獲這些方法拋出的InterruptedException來偵測線程停止信號。但也有一些方法(如InputStream.read)并不對interrupt方法調用做出響應,此時需要我們手動處理,如在同步的Socket I/O操作中通過關閉Socket,使處于I/O等待狀態的Socket拋出java.net.SocketException。

表5-1 能夠對Thread.interrupt做出響應的一些方法

執行階段 該階段的主要動作是檢查準備階段所設置的線程停止標志變量和信號,在此基礎上決定線程停止的時機,并進行適當的“清理”操作。

主站蜘蛛池模板: 乐昌市| 广宗县| 德昌县| 博客| 赣榆县| 肇州县| 东台市| 武城县| 宜宾市| 彝良县| 东宁县| 龙门县| 睢宁县| 大连市| 遵化市| 孝感市| 洪泽县| 泽州县| 高台县| 九龙坡区| 启东市| 肥城市| 浦北县| 雅江县| 清涧县| 突泉县| 休宁县| 鱼台县| 渝中区| 改则县| 拉萨市| 边坝县| 罗城| 电白县| 彝良县| 平果县| 台安县| 邓州市| 土默特左旗| 同德县| 栾城县|