1. 程式人生 > >經典的一道JAVA面試題:A、B執行緒迴圈列印A、B

經典的一道JAVA面試題:A、B執行緒迴圈列印A、B

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、基於以上方案的核心程式碼如下: