本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、概念簡介 ## 1、執行緒通訊 在作業系統中,執行緒是個獨立的個體,但是線上程執行過程中,如果處理同一個業務邏輯,可能會產生資源爭搶,導致併發問題,通常使用互斥鎖來控制該邏輯。但是在還有這樣一類場景,任務執行是有順序控制的,例如常見的報表資料生成: ![](https://img2020.cnblogs.com/blog/1691717/202005/1691717-20200516104323940-422415857.png) - 啟動資料分析任務,生成報表資料; - 報表資料存入指定位置資料容器; - 通知資料搬運任務,把資料寫入報表庫; 該場景在相對複雜的系統中非常常見,如果基於多執行緒來描述該過程,則需要執行緒之間通訊協作,才能有條不紊的處理該場景業務。 ## 2、等待通知機制 如上的業務場景,如果執行緒A生成資料過程中,執行緒B一直在訪問資料容器,判斷該過程的資料是否已經生成,則會造成資源浪費。正常的流程應該如圖,執行緒A和執行緒B同時啟動,執行緒A開始處理資料生成任務,執行緒B嘗試獲取容器資料,資料還沒過來,執行緒B則進入等待狀態,當執行緒A的任務處理完成,則通知執行緒B去容器中獲取資料,這樣基於執行緒等待和通知的機制來協作完成任務。 ## 3、基礎方法 等待/通知機制的相關方法是Java中Object層級的基礎方法,任何物件都有該方法: - notify:隨機通知一個在該物件上等待的執行緒,使其結束wait狀態返回; - notifyAll:喚醒在該物件上所有等待的執行緒,進入物件鎖爭搶佇列中; - wait:執行緒進入waiting等待狀態,不會爭搶鎖物件,也可以設定等待時間; 執行緒的等待通知機制,就是基於這幾個基礎方法。 # 二、等待通知原理 ## 1、基本原理 等待/通知機制,該模式下指執行緒A在不滿足任務執行的情況下呼叫物件wait()方法進入等待狀態,執行緒B修改了執行緒A的執行條件,並呼叫物件notify()或者notifyAll()方法,執行緒A收到通知後從wait狀態返回,進而執行後續操作。兩個執行緒通過基於物件提供的wait()/notify()/notifyAll()等方法完成等待和通知間互動,提高程式的可伸縮性。 ## 2、實現案例 通過執行緒通訊解決上述資料生成和儲存任務的解耦流程。 ```java public class NotifyThread01 { static Object lock = new Object() ; static volat