Java併發編程之基礎篇(四) – 線程間的協作
這篇介紹一下線程之間如何進行通信
之前介紹的內容都是如何保證線程之間的運行互不干擾,但是有的時候,線程之間必須互相合作。比如清洗盤子完成之後,才能對盤子進行烘乾操作,烘乾必須在清洗之後,那麼清洗線程和烘乾線程如何進行溝通呢?
Java進程間的通信與訪問共享變量一樣,都需要藉助互斥的特性來實現,在互斥的基礎上,JDK
爲線程提供了一種自我掛起的能力。也就是說想實現進程間的通信,前提必須是在synchronized
同步塊或者方法中實現。
實現互斥同步機制,Java提供了兩種方法。內置鎖synchronized
和顯示鎖Lock
,所以線程間通信也有兩種方式。
第一種方式是基於內置鎖,通過Object
對象提供的wait()
方法以及notify()/notifyAll()
方法實現。
第二種方式是基於顯示鎖,通過Condition
對象的await()
方法和signal()/signaAll()
方法。
內置鎖——線程間通信
wait()
:如果當前線程在等待某個條件發生變化之後,才能繼續執行,但是觸發條件發生變化,超出了當前線程的能力。通常需要另外一個線程來改變這種條件的時候,就需要考慮使用wait()
方法,將當前線程掛起,等待條件的改變。
比如想把盤子由清洗狀態改爲烘乾狀態,必須由烘乾線程完成。只有烘乾線程才知道烘乾操作什麼時候完成。
當調用wait()
方法將當前掛起之後,只有在notify()
或者notifyAll()
方法發生時,這個任務纔會被喚醒,繼續執行。
wait()
方法提供了兩種使用形式,第