長沙Java后端開發(fā)??济嬖囶}有哪些?
長沙Java后端開發(fā)??济嬖囶}有哪些?
長沙Java后端開發(fā)??济嬖囶}有哪些?今天小編給大家分享一位小伙伴在面試時遇到的多個線程順序執(zhí)行的面試題,希望能幫助到大家。
近日有學(xué)生在參加某公司校招面試時,遇到一個多個線程順序執(zhí)行的面試題,特意記錄下來和大家分享一下,這個題目的具體要求是這樣的:
假設(shè)有3個線程 a,b,c,要求三個線程一起進入到就緒態(tài),執(zhí)行時一定要按照 a-->b-->c的順序執(zhí)行。即使a或者b線程進入到了阻塞態(tài),也一定會按照a-->b-->c的順序運行線程。請問該如何保證實現(xiàn)這個需求呢?
解決方案
關(guān)于這道題,網(wǎng)上常見的實現(xiàn)思路,大致有4種解決方案:
- 通過join()方法使當(dāng)前線程“阻塞”,等待指定線程執(zhí)行完畢后繼續(xù)執(zhí)行;
- 通過倒數(shù)計時器CountDownLatch實現(xiàn);
- 通過創(chuàng)建單一化線程池 newSingleThreadExecutor()實現(xiàn);
- 通過ReentrantLock 中的條件變量實現(xiàn);
今天先使用ReentrantLock 的條件變量來實現(xiàn)這個題目中的需求。
使用ReentrantLock 條件變量
首先咱們來了解一下,什么是ReentrantLock 條件變量(Condition)。
ReentrantLock 中的條件變量功能,類似于普通 synchronized 的 wait、notify,我們可以使用Reentrantlock 鎖,配合 Condition 對象上的 await()和 signal()或 signalAll()方法,來實現(xiàn)線程間協(xié)作。與synchronized的wait和notify不同之處在于,ReentrantLock中的條件變量可以有多個,可以實現(xiàn)更精細的控制線程。
Condition中常用的方法API有如下這些:
ReentrantLock代碼實現(xiàn):
class ShareDataLock{
// 線程執(zhí)行的條件 1:線程1執(zhí)行 2:線程2執(zhí)行 3:線程3執(zhí)行
int number =1;
// 鎖
Lock lock = new ReentrantLock();
// 從鎖中獲得3個條件變量
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
// 第一個線程run之后執(zhí)行的方法
public void f1(){
lock.lock();
try {
// 如果條件值不為1 就掛起等待
while(number!=1){
condition1.await();
}
// 故意阻塞100毫秒,看看其他的線程會不會不再排隊
Thread.sleep(100);
System.out.println("------1--------");
// 線程1 執(zhí)行完畢 把變量設(shè)置為2
number = 2;
// 喚醒第2個條件變量
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 不管拋沒拋出異常都要解鎖,防止線程死鎖
lock.unlock();
}
}
public void f2(){
lock.lock();
try {
while(number!=2){
condition2.await();
}
System.out.println("------2--------");
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void f3(){
lock.lock();
try {
while(number!=3){
condition3.await();
}
System.out.println("------3--------");
number = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class SynchronizedAndReentrantLockDemo {
public static void main(String[] args) {
ShareDataLock shareDataLock = new ShareDataLock();
for (int i = 0; i < 10; i++) {
// 3個線程分別執(zhí)行1,2,3 3個方法 ,并且同時就緒
new Thread(()->shareDataLock.f1(),"AA").start();
new Thread(()->shareDataLock.f2(),"bb").start();
new Thread(()->shareDataLock.f3(),"cc").start();
}
}
}
現(xiàn)在我們就會發(fā)現(xiàn),3個線程已經(jīng)可以被隨意控制了,你會了嗎?
如上文所述,讓多個線程按順序執(zhí)行,網(wǎng)上常見的解決方案有4種。但大家要注意的是,面試官出這個題有一個先決條件,“要讓所有的線程同時就緒”,所以我們就可以排除使用join方法和使用單一化線程池的方案了。那么要想實現(xiàn)這個面試題中的需求,比較靠譜的方法只剩下ReentrantLock 中的條件變量和使用倒數(shù)計時器CountDownLatch兩種方案了。
長沙千鋒IT培訓(xùn)
長沙千鋒教育成立教研學(xué)科中心,推出貼近企業(yè)需求的線下技能培訓(xùn)課程。課程包含:HTML5大前端培訓(xùn)、Java+分布式開發(fā)培訓(xùn)、Python人工智能+數(shù)據(jù)分析培訓(xùn)、全領(lǐng)域?qū)崙?zhàn)UI/UE設(shè)計設(shè)計培訓(xùn)、云計算培訓(xùn)、全棧軟件測試培訓(xùn)、大數(shù)據(jù)+人工智能培訓(xùn)、智能物聯(lián)網(wǎng)+嵌入式培訓(xùn)、Unity游戲開發(fā)培訓(xùn)、網(wǎng)絡(luò)安全培訓(xùn)、區(qū)塊鏈培訓(xùn)、影視剪輯包裝培訓(xùn)、游戲原畫培訓(xùn)、全媒體運營培訓(xùn)。采用全程面授高品質(zhì)、高體驗培養(yǎng)模式,學(xué)科大綱緊跟企業(yè)需求,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),在職業(yè)教育發(fā)展道路上不斷探索前行。
長沙校區(qū)
湖南省長沙岳麓楓林三路398號麓谷明珠1棟2樓
評論 丨 共0個
- 揭秘!長沙千鋒IT培訓(xùn)怎么樣?
- 學(xué)IT技術(shù)上長沙千鋒IT培訓(xùn),優(yōu)勢多多!
- 零基礎(chǔ)該如何高效學(xué)習(xí)Python?聽聽長沙千鋒IT怎么說!
- 2023長沙大數(shù)據(jù)開發(fā)前景如何?需要學(xué)習(xí)什么?
- 長沙2023軟件測試輔導(dǎo)機構(gòu)推薦(軟件測試的重要性)
- 2023長沙短視頻拍攝制作培訓(xùn)機構(gòu)哪家好(怎么才能剪輯出好的視頻作品)
- 長沙IT培訓(xùn)學(xué)費一般多少錢?
- 長沙人氣前10軟件測試培訓(xùn)機構(gòu)一覽(軟件測試方法有哪些)
- 長沙前端培訓(xùn)需要多久?前景如何?
- 5G商用時代來了,長沙千鋒教育IT培訓(xùn)賦能人才未來