基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明
2018.12.12更新
在學(xué)習(xí)了CyclicBarrier之后發(fā)現(xiàn),CyclicBarrier也可以實(shí)現(xiàn)跟CountDownLatch類似的功能,只需要在它的parties中多設(shè)置一個(gè)數(shù),將主線程加入等待隊(duì)列就可以了:
public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); int size = 3; // 設(shè)置參數(shù)時(shí),線程實(shí)際執(zhí)行數(shù)size+1,將main線程也加到等待隊(duì)列中 CyclicBarrier cyclicBarrier = new CyclicBarrier(size + 1); for (int i = 0; i < size; i++) { int index = i; pool.submit(() -> { try { TimeUnit.SECONDS.sleep(index); System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了"); cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } }); } try { //主線程也加入等待 cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!"); }
執(zhí)行結(jié)果:
以下是原內(nèi)容:
我在使用并發(fā)線程?hào)艡诘臅r(shí)候發(fā)現(xiàn)了兩種,分別是CyclicBarrier 和CountDownLatch。對(duì)于兩者的對(duì)比的文章有很多,這里不再贅述。我來(lái)說(shuō)下我的使用過(guò)程。
**需求:**有三位運(yùn)動(dòng)員,他們一起參加萬(wàn)米賽跑,但是他們準(zhǔn)備的時(shí)間不同,要等他們都準(zhǔn)備好了再開(kāi)始一起跑。
使用CyclicBarrier 實(shí)現(xiàn):
import java.util.concurrent.*; public class RunTest { public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); int size = 3; CyclicBarrier cyclicBarrier = new CyclicBarrier(size, () -> { System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!"); pool.shutdownNow(); }); for (int i = 0; i < size; i++) { int index = i; pool.submit(() -> { try { TimeUnit.SECONDS.sleep(index); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了"); try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); } } }
結(jié)果:
可以看到,三位運(yùn)動(dòng)員準(zhǔn)備的時(shí)間分別是1s,2s,3s。系統(tǒng)等到他們都準(zhǔn)備好了,再發(fā)出起跑的信號(hào)。在這里CyclicBarrier 做法是在自己的構(gòu)造器中new了一個(gè)runnable,等待其他線程都執(zhí)行完,再執(zhí)行此runnable中的代碼。
我們?cè)倏纯碈ountDownLatch怎么實(shí)現(xiàn):
import java.util.concurrent.*; public class RunTest { public static void main(String[] args) throws InterruptedException { ExecutorService pool = Executors.newCachedThreadPool(); CountDownLatch countDownLatch = new CountDownLatch(3); int size = 3; for (int i = 0; i < size; i++) { int index = i; pool.submit(() -> { try { TimeUnit.SECONDS.sleep(index); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了"); }); } countDownLatch.await(); System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!"); } }
結(jié)果同上:
我們可以看到,countDownLatch是采取阻塞主線程的方法實(shí)現(xiàn)了線程的統(tǒng)一。他內(nèi)部有一個(gè)計(jì)數(shù)器,我們?cè)趫?zhí)行完一次線程任務(wù)的時(shí)候需要手動(dòng)的減一個(gè)數(shù),在主線程中使用 **countDownLatch.await()**監(jiān)控計(jì)數(shù)器的狀態(tài),知道計(jì)數(shù)器計(jì)到0為止,再執(zhí)行主線程的代碼。
在實(shí)際的開(kāi)發(fā)中,我個(gè)人比較傾向于第二種方法,因?yàn)槭褂闷饋?lái)簡(jiǎn)單,完全滿足我的需求。
以上這篇基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+aop實(shí)現(xiàn)主從數(shù)據(jù)庫(kù)的讀寫分離操作
讀寫分離的作用是為了緩解寫庫(kù),也就是主庫(kù)的壓力,但一定要基于數(shù)據(jù)一致性的原則,就是保證主從庫(kù)之間的數(shù)據(jù)一定要一致,這篇文章給大家介紹SpringBoot+aop實(shí)現(xiàn)主從數(shù)據(jù)庫(kù)的讀寫分離操作,感興趣的朋友跟隨小編一起看看吧2024-03-03Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法
這篇文章主要介紹了Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法,涉及Java中toCharArray與valueOf方法的使用技巧,需要的朋友可以參考下2015-12-12Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼
這篇文章主要為大家介紹了如何用Java語(yǔ)言實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成,項(xiàng)目采用了springboot,maven等技術(shù),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-02-02elasticsearch索引index數(shù)據(jù)功能源碼示例
這篇文章主要為大家介紹了elasticsearch索引index功能源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Java中replace與replaceAll的區(qū)別與測(cè)試
replace和replaceAll是JAVA中常用的替換字符的方法,下面這篇文章主要給大家介紹了關(guān)于Java中replace與replaceAll的區(qū)別與測(cè)試,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09SpringBoot實(shí)現(xiàn)在一個(gè)模塊中引入另一個(gè)模塊
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)在一個(gè)模塊中引入另一個(gè)模塊的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10