Java併發編程之基礎篇(四) -- 線程間的協作

Java併發編程之基礎篇(四) – 線程間的協作

這篇介紹一下線程之間如何進行通信

之前介紹的內容都是如何保證線程之間的運行互不干擾,但是有的時候,線程之間必須互相合作。比如清洗盤子完成之後,才能對盤子進行烘乾操作,烘乾必須在清洗之後,那麼清洗線程和烘乾線程如何進行溝通呢?

Java進程間的通信與訪問共享變量一樣,都需要藉助互斥的特性來實現,在互斥的基礎上,JDK爲線程提供了一種自我掛起的能力。也就是說想實現進程間的通信,前提必須是在synchronized同步塊或者方法中實現。

實現互斥同步機制,Java提供了兩種方法。內置鎖synchronized和顯示鎖Lock,所以線程間通信也有兩種方式。
第一種方式是基於內置鎖,通過Object對象提供的wait()方法以及notify()/notifyAll()方法實現。
第二種方式是基於顯示鎖,通過Condition對象的await()方法和signal()/signaAll()方法。

內置鎖——線程間通信

wait():如果當前線程在等待某個條件發生變化之後,才能繼續執行,但是觸發條件發生變化,超出了當前線程的能力。通常需要另外一個線程來改變這種條件的時候,就需要考慮使用wait()方法,將當前線程掛起,等待條件的改變。

比如想把盤子由清洗狀態改爲烘乾狀態,必須由烘乾線程完成。只有烘乾線程才知道烘乾操作什麼時候完成。

當調用wait()方法將當前掛起之後,只有在notify()或者notifyAll()方法發生時,這個任務纔會被喚醒,繼續執行。

wait()方法提供了兩種使用形式,第

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章