經典的一道JAVA面試題:A、B執行緒迴圈列印A、B
阿新 • • 發佈:2019-01-23
1、問題描述
通過Java多執行緒方式實現迴圈順序列印A、B,而且保證無論多少次迴圈,都不亂序?
2、問題的解決方案
其實這個問題,背後考察的是一個生產者和消費者的問題。即:要保證當前一個執行緒的任務完成之後,再去執行另一個執行緒的任務。由多種解決方法:
1、利用wait和notify方法和synchronized關鍵字聯合完成
2、利用重入鎖 ReentrantLock和Condition
3、方案分析:
第一種更接近於原理層面,但是,第二種更加簡單。因為重入鎖把這些都封裝起來了,在使用起來也更加方便。
4、核心類介紹:
1、重入鎖ReentrantLock,參考一下連結的文章:
2、Condition類的核心方法
1、await()方法會是當前執行緒等待,同時釋放當前鎖,當其他執行緒中使用signal()或signalAll()方法時,執行緒會重新獲得鎖並繼續執行。或者當執行緒
被中斷時,也能跳出等待。這和obj.wait方法很類似。
2、awaitUninterruptibly()方法與await()方法基本相同。只不過它不會載等待過程中響應中斷。
3、signal()方法用於喚醒一個在等待中的執行緒,這和obj.notify方法很類似
5、基於以上方案的核心程式碼如下: