- Java多線程編程實戰指南:設計模式篇(第2版)
- 黃文海
- 589字
- 2021-10-15 19:24:59
第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做出響應的一些方法

執行階段 該階段的主要動作是檢查準備階段所設置的線程停止標志變量和信號,在此基礎上決定線程停止的時機,并進行適當的“清理”操作。
- 基于粒計算模型的圖像處理
- LabVIEW Graphical Programming Cookbook
- C# 2012程序設計實踐教程 (清華電腦學堂)
- Mastering Entity Framework
- React Native Cookbook
- Bootstrap Essentials
- 高級C/C++編譯技術(典藏版)
- 深度強化學習算法與實踐:基于PyTorch的實現
- Learn React with TypeScript 3
- SQL Server與JSP動態網站開發
- Instant PHP Web Scraping
- Learning YARN
- Visual C#.NET Web應用程序設計
- Go語言編程
- Mastering Python Design Patterns