創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網站策劃、網站設計、做網站、網站設計、電子商務、網站推廣、網站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網的全面整合營銷服務。公司擁有豐富的網站建設和互聯(lián)網應用系統(tǒng)開發(fā)管理經驗、成熟的應用系統(tǒng)解決方案、優(yōu)秀的網站開發(fā)工程師團隊及專業(yè)的網站設計師團隊。Java中CountDownLatch進行多線程同步詳解
CountDownLatch介紹
在前面的Java學習筆記中,總結了Java中進行多線程同步的幾個方法:
1、synchronized關鍵字進行同步。
2、Lock鎖接口及其實現(xiàn)類ReentrantLock、ReadWriteLock鎖實現(xiàn)同步。
3、信號量Semaphore實現(xiàn)同步。
其中,synchronized關鍵字和Lock鎖解決的是多個線程對同一資源的并發(fā)訪問問題。信號量Semaphore解決的是多副本資源的共享訪問問題。
今天,來學習一下Java中的另外一個多線程同步輔助類:CountDownLatch。官方文檔對CountDownLatch的解釋是:在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。也就是說,CountDownLatch控制某個或者多個線程,讓它們等待多個線程完成某項任務后,再啟動。CountDownLatch主要是用來同步多個任務的執(zhí)行,區(qū)別于其他的synchronized關鍵字,鎖,信號量是用來同步共享資源的。
CountDownLatch實現(xiàn)原理簡介:
CountDownLatch內部維護一個計數(shù)器,計數(shù)器的值為待完成的任務數(shù)N,需要等待這N個任務完成的線程調用
CountDownLatch的await()方法使自己進入休眠等待狀態(tài)。
當某一個任務線程完成某一個任務后調用CountDownLatch的countDown()方法來表示自己的任務已完成,此時CountDownLatch的計數(shù)器值減1,當所有的任務完成式,計數(shù)器的值為0。當計數(shù)器值為0時,CountDownLatch將喚醒所有因await()方法進入休眠的線程。
CountDownLatch的使用:
CountDownLatch的使用主要有3點:
1、CountDownLatch的聲明及初始化,在初始化時需要指定等待完成的任務數(shù)。
2、某一個任務完成時調用CountDownLatch的countDown()方法,向CountDownLatch報告自己的任務已經完成,
3、需要等待任務完成的線程調用CountDownLatch的await()方法,調用后該線程將進入休眠,并在所有任務數(shù)完成后CountDownLatch的計數(shù)器值為0時,因await()方法進行休眠的線程將被喚醒。
在此本人在Java 7并發(fā)編程實戰(zhàn)手冊該書中的CountDownLatch使用示例的基礎上做了部分改進,來演示CountDownLatch的使用詳情:
模擬10個參會者和一個主持人參加的一個會以,每個參會者及主持人需要等待其他的參會者均到場簽到之后,才能開始會以并發(fā)言。為此,先創(chuàng)建一個會以管理的類VideoConference,其提供一個arrive()方法供參會者調用來進行簽到。會議管理的擁有者是主持人,其等待每個參會者的簽到:
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初始化其內部的計數(shù)器,當初始化完成后,不能再次初始化 } public void arrive(String name){ //每個需要同步的任務,在任務完成時,需要調用該方法 countDownLatch.countDown();//countDownLatch內部的計數(shù)器減1 System.out.print("arrive:"+name+"\n"); try{ countDownLatch.await();//await方法是線程進入休眠,當countDownLatch計數(shù)器為0時,將被喚醒 //線程被喚醒,在這里可以執(zhí)行一系列任務 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方法是線程進入休眠,當countDownLatch計數(shù)器為0時,將被喚醒 //線程被喚醒,在這里可以執(zhí)行一系列任務 System.out.print("all arrived:"+(number-countDownLatch.getCount())+"\n"); }catch (InterruptedException e){ e.printStackTrace(); } } }
文章名稱:Java中CountDownLatch進行多線程同步詳解及實例代碼-創(chuàng)新互聯(lián)
網頁路徑:http://m.rwnh.cn/article30/iidso.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供商城網站、網站建設、微信小程序、營銷型網站建設、品牌網站設計、用戶體驗
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)