本篇內(nèi)容主要講解“怎么使用CyclicBarrier”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用CyclicBarrier”吧!
創(chuàng)新互聯(lián)公司基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶(hù)提供專(zhuān)業(yè)成都機(jī)柜租用報(bào)價(jià),主機(jī)托管價(jià)格性?xún)r(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專(zhuān)業(yè)成都idc公司。
CyclicBarrier與CountDownLatch比較相似,CountDownLatch的await方法阻塞線程,直到足夠數(shù)量的countDown后所有線程重新開(kāi)始運(yùn)行,而CyclicBarrier的await則是阻塞線程,當(dāng)await的數(shù)量達(dá)到指定數(shù)量是所有阻塞線程直接重新開(kāi)始運(yùn)行。
CyclicBarrier有兩個(gè)構(gòu)造方法“public CyclicBarrier(int parties, Runnable barrierAction)“與”public CyclicBarrier(int parties)”。其中parties是在調(diào)用await方法次數(shù)達(dá)到的最大次數(shù),當(dāng)達(dá)到就會(huì)喚醒所有阻塞線程。barrierAction是當(dāng)正常喚醒所有線程前優(yōu)先執(zhí)行的任務(wù)。
屬性主要有以下幾個(gè):
//這兩個(gè)屬性用來(lái)保持同步和線程阻塞與喚醒
private final ReentrantLock lock = new ReentrantLock();
private final Condition trip = lock.newCondition();
//每個(gè)輪的最大await的次數(shù)
private final int parties;
//當(dāng)線程被喚醒前可以?xún)?yōu)先一些執(zhí)行任務(wù),可以設(shè)置在這里
private final Runnable barrierCommand;
//這是一個(gè)內(nèi)部類(lèi),通過(guò)它實(shí)現(xiàn)CyclicBarrier重復(fù)利用,每當(dāng)await達(dá)到最大次數(shù)的時(shí)候,就會(huì)新建一個(gè)放到這里,表示進(jìn)入了下一個(gè)輪回,里面只有一個(gè)boolean型屬性,用來(lái)表示當(dāng)前輪回是否有線程中斷,
private Generation generation = new Generation();
//當(dāng)前輪回剩余await的次數(shù),初始值是parties,沒(méi)調(diào)用一次await方法就減一,當(dāng)減到0就喚醒線程。
private int count;
這幾個(gè)屬性可能在這里還不清楚他們的作用,不過(guò)接下來(lái)下一節(jié)就清楚了。
CyclicBarrier最主要的方法就是await方法了,而await方法調(diào)用的是一個(gè)私有方法dowait,dowait的方法源碼較長(zhǎng)這里就不貼出來(lái)了,通過(guò)流程圖分析下如下圖:
我把dowait方法主要分成3步:
第一步是記錄當(dāng)前代generation,并且count減一。第二、三步是根據(jù)count減少后的值進(jìn)行判斷。
第二步是count等于0的情況,表明調(diào)用await方法達(dá)到預(yù)設(shè)次數(shù),應(yīng)該喚醒其他線程,不過(guò)步驟是優(yōu)先運(yùn)行設(shè)置的barrierCommand任務(wù),然后創(chuàng)建下一代generation,表示后面調(diào)用await會(huì)進(jìn)入下一個(gè)輪回,最后才是喚醒所有線程。
第三步是最后一步,也是發(fā)生阻塞線程的地方,當(dāng)count不等于0則會(huì)直接阻塞線程,await支持阻塞指定時(shí)間,這里就沒(méi)有特別說(shuō)明了。當(dāng)線程被喚醒,這里喚醒有兩種情況:一種是第二步最后的喚醒,應(yīng)該重新new了一個(gè)generation,所以可以讓線程跳出循環(huán),不在阻塞線程。一種是因?yàn)橛幸粋€(gè)線程拋出中斷異常而喚醒,中斷異常會(huì)修改g的broken為true,使當(dāng)前線程拋出指定的異常。
到此,相信大家對(duì)“怎么使用CyclicBarrier”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!