京東的一道A、B線程面試題:兩個線程循環順序打印A、B(有代碼)

編程語言 Java 面試 電子商務 互聯網IT技術 互聯網IT技術 2017-10-14

1. 問題描述

通過Java多線程方式實現循環順序打印A、B,而且保證無論多少次循環,都不亂序?

2. 問題的解決方案

其實這個問題,背後考察的是一個生產者和消費者的問題。即:要保證當前一個線程的任務完成之後,再去執行另一個線程的任務。有多種解決方案:

1)第一種:利用wait和notify方法和synchronized關鍵字聯合完成。

2)第二種:利用重入鎖ReentrantLock和Condition

3. 方案分析:

第一種更接近於原理層面。但是,第二種更加簡單。因為重入鎖把這些都封裝起來了,在使用起來也更加方便。

4. 核心類介紹:

(1) 重入鎖ReentrantLock,參考以下鏈接的文章:

Java:重入鎖ReentranLock詳解、代碼實戰、與Synchronized對比

(2)Condition類的核心方法:

1)await() 方法會是當前線程等待,同時釋放當前鎖,當其他線程中使用signal() 或signalAll() 方法時,線程會重新獲得鎖並繼續執行。或者當線程被中斷時,也能跳出等待。這和obj.wait方法很相似。

2)awaitUninterruptibly() 方法與await() 方法基本相同,只不過它不會在等待過程中響應中斷。

3)signal() 方法用於喚醒一個在等待中的線程,這和obj.notify方法很類似。

5. 基於以上方案的核心代碼如下:

京東的一道A、B線程面試題:兩個線程循環順序打印A、B(有代碼)

輸出結果是:

A,B

A,B

A,B

A,B

A,B

一直循環下去打印A,B

此頭條號每天都會分享非常實用的技術文章和筆試題講解,歡迎大家關注此頭條號!

相關推薦

推薦中...