創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

Java中CountDownLatch進(jìn)行多線程同步詳解
CountDownLatch介紹
在前面的Java學(xué)習(xí)筆記中,總結(jié)了Java中進(jìn)行多線程同步的幾個(gè)方法:
1、synchronized關(guān)鍵字進(jìn)行同步。
2、Lock鎖接口及其實(shí)現(xiàn)類ReentrantLock、ReadWriteLock鎖實(shí)現(xiàn)同步。
3、信號(hào)量Semaphore實(shí)現(xiàn)同步。
其中,synchronized關(guān)鍵字和Lock鎖解決的是多個(gè)線程對(duì)同一資源的并發(fā)訪問(wèn)問(wèn)題。信號(hào)量Semaphore解決的是多副本資源的共享訪問(wèn)問(wèn)題。
今天,來(lái)學(xué)習(xí)一下Java中的另外一個(gè)多線程同步輔助類:CountDownLatch。官方文檔對(duì)CountDownLatch的解釋是:在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。也就是說(shuō),CountDownLatch控制某個(gè)或者多個(gè)線程,讓它們等待多個(gè)線程完成某項(xiàng)任務(wù)后,再啟動(dòng)。CountDownLatch主要是用來(lái)同步多個(gè)任務(wù)的執(zhí)行,區(qū)別于其他的synchronized關(guān)鍵字,鎖,信號(hào)量是用來(lái)同步共享資源的。
CountDownLatch實(shí)現(xiàn)原理簡(jiǎn)介:
CountDownLatch內(nèi)部維護(hù)一個(gè)計(jì)數(shù)器,計(jì)數(shù)器的值為待完成的任務(wù)數(shù)N,需要等待這N個(gè)任務(wù)完成的線程調(diào)用
CountDownLatch的await()方法使自己進(jìn)入休眠等待狀態(tài)。
當(dāng)某一個(gè)任務(wù)線程完成某一個(gè)任務(wù)后調(diào)用CountDownLatch的countDown()方法來(lái)表示自己的任務(wù)已完成,此時(shí)CountDownLatch的計(jì)數(shù)器值減1,當(dāng)所有的任務(wù)完成式,計(jì)數(shù)器的值為0。當(dāng)計(jì)數(shù)器值為0時(shí),CountDownLatch將喚醒所有因await()方法進(jìn)入休眠的線程。
CountDownLatch的使用:
CountDownLatch的使用主要有3點(diǎn):
1、CountDownLatch的聲明及初始化,在初始化時(shí)需要指定等待完成的任務(wù)數(shù)。
2、某一個(gè)任務(wù)完成時(shí)調(diào)用CountDownLatch的countDown()方法,向CountDownLatch報(bào)告自己的任務(wù)已經(jīng)完成,
3、需要等待任務(wù)完成的線程調(diào)用CountDownLatch的await()方法,調(diào)用后該線程將進(jìn)入休眠,并在所有任務(wù)數(shù)完成后CountDownLatch的計(jì)數(shù)器值為0時(shí),因await()方法進(jìn)行休眠的線程將被喚醒。
在此本人在Java 7并發(fā)編程實(shí)戰(zhàn)手冊(cè)該書中的CountDownLatch使用示例的基礎(chǔ)上做了部分改進(jìn),來(lái)演示CountDownLatch的使用詳情:
模擬10個(gè)參會(huì)者和一個(gè)主持人參加的一個(gè)會(huì)以,每個(gè)參會(huì)者及主持人需要等待其他的參會(huì)者均到場(chǎng)簽到之后,才能開始會(huì)以并發(fā)言。為此,先創(chuàng)建一個(gè)會(huì)以管理的類VideoConference,其提供一個(gè)arrive()方法供參會(huì)者調(diào)用來(lái)進(jìn)行簽到。會(huì)議管理的擁有者是主持人,其等待每個(gè)參會(huì)者的簽到:
public class VideoConference implements Runnable{
private final CountDownLatch countDownLatch;
private int number;
public VideoConference(int number) {
this.number = number;
this.countDownLatch = new CountDownLatch(number);//使用Number初始化其內(nèi)部的計(jì)數(shù)器,當(dāng)初始化完成后,不能再次初始化
}
public void arrive(String name){
//每個(gè)需要同步的任務(wù),在任務(wù)完成時(shí),需要調(diào)用該方法
countDownLatch.countDown();//countDownLatch內(nèi)部的計(jì)數(shù)器減1
System.out.print("arrive:"+name+"\n");
try{
countDownLatch.await();//await方法是線程進(jìn)入休眠,當(dāng)countDownLatch計(jì)數(shù)器為0時(shí),將被喚醒
//線程被喚醒,在這里可以執(zhí)行一系列任務(wù)
System.out.print("name:"+name + " say:let's start..." +"\n");
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void run(){
System.out.print("has arrive:"+(number-countDownLatch.getCount())+"\n");
try{
countDownLatch.await();//await方法是線程進(jìn)入休眠,當(dāng)countDownLatch計(jì)數(shù)器為0時(shí),將被喚醒
//線程被喚醒,在這里可以執(zhí)行一系列任務(wù)
System.out.print("all arrived:"+(number-countDownLatch.getCount())+"\n");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
文章名稱:Java中CountDownLatch進(jìn)行多線程同步詳解及實(shí)例代碼-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://www.chinadenli.net/article30/iidso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站建設(shè)、微信小程序、營(yíng)銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容