日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

發(fā)布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
作者:dadiyang來源:https://blog.csdn.net/dadiyang/article/details/88315124

面試場景

面試官:Java多線程了解嗎?你給我寫一下,起兩個線程交替打印0~100的奇偶數(shù)。

小黃:啊?

面試官:就是有兩個線程,一個線程打印奇數(shù)另一個打印偶數(shù),它們交替輸出,類似這樣。

偶線程:0奇線程:1偶線程:2……奇線程:99偶線程:100

小黃:啊?

面試官:……嗯。好的。回去等通知吧。

解說

遇到這種突如其來的面試題,有時候會讓人無從下手。盡管可能你學(xué)習(xí)過多線程的知識,但是面試官拋一個問題過來,短時間內(nèi)可能想不出如何使用這些知識來解決這個具體的問題。其實這個問題考察的知識點并不難,但是如果準(zhǔn)備的面試的時候沒有看過這道題,一時間還是比較難想出解決方案來的,而且這種題往往是讓面試者手寫代碼。

回到題目上來。首先是兩個線程,其次是交替打印。這可以聯(lián)系到線程之間的通信問題。這時可以想到大致的方向就是加鎖,哪個線程拿到鎖就打印,然后釋放鎖讓另一個線程獲取鎖。兩個線程輪流拿到鎖,實現(xiàn)交替打印的效果。

起兩個線程大家都會,加鎖也簡單,問題是如何讓這兩個線程輪流拿到鎖呢?我們知道,加鎖之后線程之前相互競爭鎖,而Java默認(rèn)是不保證鎖的公平性的(使用公平鎖可能也是一個思路),這就有可能出現(xiàn)同一個線程一直打印而另一個線程一直沒有打印的情況。

討巧的方案

比較容易想的一個方案是,要輸出的時候判斷一下當(dāng)前需要輸出的數(shù)是不是自己要負(fù)責(zé)打印的值,如果是就輸出,不是就直接釋放鎖。

輸出結(jié)果如下。

偶數(shù): 0奇數(shù): 1偶數(shù): 2……奇數(shù): 99偶數(shù): 100

從輸出上看,是實現(xiàn)了題目上的要求,兩個線程,一個打印奇數(shù),一個打印偶數(shù),輪流輸出。但只是用了一個討巧的方式避開了線程交替獲取鎖的需求,明顯沒有答到面試官想考察的考點上。而且效率較低,如果同一個線程一直搶到鎖,而另一個線程一直沒有拿到,就會導(dǎo)致線程做很多無謂的空轉(zhuǎn)。那么有沒有更好的解決方案,讓兩個線程嚴(yán)格地交替獲取到鎖呢?

交替獲取鎖的方案

上面為了直觀起見,我將兩個線程都獨立寫了出來,其實 Thead 中的代碼是相同的,可以抽成一個 Runnable 類。

輸出結(jié)果如下。

偶數(shù): 0奇數(shù): 1偶數(shù): 2……奇數(shù): 99偶數(shù): 100

這種實現(xiàn)方式的原理就是線程1打印之后喚醒其他線程,然后讓出鎖,自己進(jìn)入休眠狀態(tài)。因為進(jìn)入了休眠狀態(tài)就不會與其他線程搶鎖,此時只有線程2在獲取鎖,所以線程2必然會拿到鎖。線程2以同樣的邏輯執(zhí)行,喚醒線程1并讓出自己持有的鎖,自己進(jìn)入休眠狀態(tài)。這樣來來回回,持續(xù)執(zhí)行直到任務(wù)完成。就達(dá)到了兩個線程交替獲取鎖的效果了。

至此,本題解決。

擴展

兩個線程交替打印的問題解決了,讓我們來擴展一下,如果有三個線程,要求讓它們交替輸出 1、2、3,即。

線程1:1線程2:2線程3:3線程1:1線程2:2線程3:3……

這種情況要怎么解決呢?歡迎留言討論。

總結(jié)

以上是生活随笔為你收集整理的线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。