juc包:使用 juc 包下的顯式 Lock 實現執行緒間通訊
阿新 • • 發佈:2020-10-09
# 一、前置知識
執行緒間通訊三要素: 多執行緒+**判斷**+操作+**通知**+資源類。 上面的五個要素,其他三個要素就是普通的多執行緒程式問題,那麼通訊就需要執行緒間的互相通知,往往伴隨著何時通訊的判斷邏輯。 在 java 的 Object 類裡就提供了對應的方法來進行通知,同樣的,保證安全的判斷採用隱式的物件鎖,也就是 synchronized 關鍵字實現。這塊內容在: [java多執行緒:執行緒間通訊——生產者消費者模型](https://www.cnblogs.com/lifegoeson/p/13528098.html) 已經寫過。
# 二、使用 Lock 實現執行緒間通訊
# 三、喚醒特定執行緒
新技術解決了舊問題,這個方法解決的問題就是,在生產者消費者問題裡:有時候我們並不想喚醒所有的對面夥伴,而只想要喚醒特定的一部分,這時候該怎麼辦呢? 如果沒有顯式的 lock,我們的思路可能是: 1. 採用一個標誌物件,可以是一個數值或者別的; 2. 當通訊呼叫 signalAll 的時候,其他執行緒都去判斷這個標誌,從而決定自己應不應該工作。 這種實現是可行的,但是本質上其他執行緒都被喚醒,然後一直阻塞+判斷,其實還是在競爭。那麼 Condition 類其實就已經提供了對應的方法,來完成這樣的操作: 我們看這樣一個需求: * 同樣是多執行緒操作、需要通訊。但是我們要**指定各個執行緒交替的順序**,以及**指定喚醒的時候是指定哪個具體執行緒**,這樣就不會存在喚醒所有執行緒然後他們之間互相競爭了。 * 具體說是:**AA 列印 5 次,BB 列印 10 次, CC 列印 15次,然後接著從 AA 開始一輪三個交替**。 程式碼如下: ``` public class TakeTurnPrint { public static void main(String[] args) { ShareResource resource = new ShareResource(); new Thread(()->