溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用CyclicBarrier

發(fā)布時間:2021-11-17 12:02:28 來源:億速云 閱讀:129 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么使用CyclicBarrier”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用CyclicBarrier”吧!

CyclicBarrier功能

CyclicBarrier與CountDownLatch比較相似,CountDownLatch的await方法阻塞線程,直到足夠數(shù)量的countDown后所有線程重新開始運行,而CyclicBarrier的await則是阻塞線程,當await的數(shù)量達到指定數(shù)量是所有阻塞線程直接重新開始運行。

構(gòu)造方法與結(jié)構(gòu)

CyclicBarrier有兩個構(gòu)造方法“public CyclicBarrier(int parties, Runnable barrierAction)“與”public CyclicBarrier(int parties)”。其中parties是在調(diào)用await方法次數(shù)達到的最大次數(shù),當達到就會喚醒所有阻塞線程。barrierAction是當正常喚醒所有線程前優(yōu)先執(zhí)行的任務。

屬性主要有以下幾個:

//這兩個屬性用來保持同步和線程阻塞與喚醒

    private final ReentrantLock lock = new ReentrantLock();

    private final Condition trip = lock.newCondition();

//每個輪的最大await的次數(shù)

    private final int parties;

    //當線程被喚醒前可以優(yōu)先一些執(zhí)行任務,可以設置在這里

private final Runnable barrierCommand;

//這是一個內(nèi)部類,通過它實現(xiàn)CyclicBarrier重復利用,每當await達到最大次數(shù)的時候,就會新建一個放到這里,表示進入了下一個輪回,里面只有一個boolean型屬性,用來表示當前輪回是否有線程中斷,

    private Generation generation = new Generation();

//當前輪回剩余await的次數(shù),初始值是parties,沒調(diào)用一次await方法就減一,當減到0就喚醒線程。

    private int count;

這幾個屬性可能在這里還不清楚他們的作用,不過接下來下一節(jié)就清楚了。

主要方法

CyclicBarrier最主要的方法就是await方法了,而await方法調(diào)用的是一個私有方法dowait,dowait的方法源碼較長這里就不貼出來了,通過流程圖分析下如下圖:怎么使用CyclicBarrier 

我把dowait方法主要分成3步:

第一步是記錄當前代generation,并且count減一。第二、三步是根據(jù)count減少后的值進行判斷。

第二步是count等于0的情況,表明調(diào)用await方法達到預設次數(shù),應該喚醒其他線程,不過步驟是優(yōu)先運行設置的barrierCommand任務,然后創(chuàng)建下一代generation,表示后面調(diào)用await會進入下一個輪回,最后才是喚醒所有線程。

第三步是最后一步,也是發(fā)生阻塞線程的地方,當count不等于0則會直接阻塞線程,await支持阻塞指定時間,這里就沒有特別說明了。當線程被喚醒,這里喚醒有兩種情況:一種是第二步最后的喚醒,應該重新new了一個generation,所以可以讓線程跳出循環(huán),不在阻塞線程。一種是因為有一個線程拋出中斷異常而喚醒,中斷異常會修改g的broken為true,使當前線程拋出指定的異常。

到此,相信大家對“怎么使用CyclicBarrier”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI