Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解
一.CountDownLatch 和 CyclicBarrier的區(qū)別
CountDownLatch 的計(jì)數(shù)器是大于或等于線程數(shù)的,而CyclicBarrier是一定等于線程數(shù)CountDownLatch 放行由其他線程控制而CyclicBarrier是由本身來控制的
二.詳解
CountDownLatch
說明: 一個(gè)線程等待其他線程執(zhí)行完之后再執(zhí)行,相當(dāng)于加強(qiáng)版的join,在初始化CountDownLatch是需要設(shè)定計(jì)數(shù)器的數(shù)值(計(jì)數(shù)器數(shù)據(jù)不一定跟線程數(shù)相同,但是一定計(jì)數(shù)器的值一定是要大于等于線程數(shù),一個(gè)線程中可以進(jìn)行多次扣減。當(dāng)計(jì)數(shù)器扣減至0時(shí)才可繼續(xù)向下執(zhí)行)
舉例說明:
比如LOL在游戲開始時(shí)需要玩家全部準(zhǔn)備完畢之后才開始,開始游戲可以理解為“主線程”,玩家準(zhǔn)備理解為“其他線程”,在“其他線程”沒有準(zhǔn)備完畢之前,“主線程時(shí)等待狀態(tài)”,當(dāng)“其他線程”準(zhǔn)備完畢之后“主線程”就會(huì)執(zhí)行下一步開始游戲的動(dòng)作
代碼示例
public class CountDownLatchTest { private static CountDownLatch countDownLatsh = new CountDownLatch(5); private static class Player implements Runnable{ private Integer index; public Player(Integer index){ this.index = index; } @Override public void run() { System.out.println("玩家"+index+"準(zhǔn)備完成"); countDownLatsh.countDown(); } } public static void main(String[] args) throws InterruptedException { for(int i = 0; i < 5; i++){ Player player = new Player(i); Thread thread = new Thread(player); thread.start(); } countDownLatsh.await(); System.out.println("玩家準(zhǔn)備完畢,開始游戲"); } }
運(yùn)行結(jié)果
玩家0準(zhǔn)備完成
玩家1準(zhǔn)備完成
玩家2準(zhǔn)備完成
玩家3準(zhǔn)備完成
玩家4準(zhǔn)備完成
玩家準(zhǔn)備完畢,開始游戲
cyclicbarrier
說明: 讓一組線程到達(dá)某個(gè)屏障,然后被阻塞,一直到最后一個(gè)線程到達(dá)屏障,然后屏障開放,所有被阻塞的線程繼續(xù)執(zhí)行,計(jì)數(shù)器與線程數(shù)相等。
CyclicBarrier(int parties, Runnable barrierAction) 當(dāng)時(shí)使用這個(gè)構(gòu)造函數(shù)時(shí),barrierAction定義的任務(wù)會(huì)執(zhí)行
舉例說明: 假設(shè)有一家公司要全體員工進(jìn)行團(tuán)建活動(dòng),活動(dòng)內(nèi)容為翻越三個(gè)障礙物,每一個(gè)人翻越障礙物所用的時(shí)間是不一樣的。但是公司要求所有人在翻越當(dāng)前障礙物之后再開始翻越下一個(gè)障礙物,也就是所有人翻越第一個(gè)障礙物之后,才開始翻越第二個(gè),以此類推比如跨欄比賽,我們修改一下規(guī)則,當(dāng)所有選手都跨過第一個(gè)欄桿是,才去跨第二個(gè),以此類推,每一個(gè)員工都是一個(gè)“其他線程”。當(dāng)所有人都翻越的所有的障礙物之后,程序才結(jié)束。而主線程可能早就結(jié)束了,這里我們不用管主線程。
代碼示例
public class CyclicBarrierTest { private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5); public static class Surmount implements Runnable{ @Override public void run() { try { for(int i = 1; i < 4; i++){ Random rand = new Random(); int randomNum = rand.nextInt((3000 - 1000) + 1) + 1000;//產(chǎn)生1000到3000之間的隨機(jī)整數(shù) Thread.sleep(randomNum); String name = Thread.currentThread().getName(); System.out.println(name+"翻過了第" + i +"個(gè)障礙"); cyclicBarrier.await(); } } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } public static void main(String[] args){ for (int i = 1; i < 6; i++){ Thread thread = new Thread(new Surmount(),"選手"+ i ); thread.start(); } System.out.println("main is end"); } }
運(yùn)行結(jié)果:
main is end
選手4翻過了第1個(gè)障礙
選手2翻過了第1個(gè)障礙
選手1翻過了第1個(gè)障礙
選手5翻過了第1個(gè)障礙
選手3翻過了第1個(gè)障礙
選手1翻過了第2個(gè)障礙
選手4翻過了第2個(gè)障礙
選手3翻過了第2個(gè)障礙
選手5翻過了第2個(gè)障礙
選手2翻過了第2個(gè)障礙
選手5翻過了第3個(gè)障礙
選手2翻過了第3個(gè)障礙
選手1翻過了第3個(gè)障礙
選手4翻過了第3個(gè)障礙
選手3翻過了第3個(gè)障礙
到此這篇關(guān)于Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解的文章就介紹到這了,更多相關(guān)Java CountDownLatch CyclicBarrier內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
delphi中exit,abort,break,continue的區(qū)別介紹
本文詳細(xì)介紹下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的區(qū)別,感興趣的朋友可以參考下哈,希望對(duì)你學(xué)習(xí)跳出有所幫助2013-04-04Delphi實(shí)現(xiàn)限定軟件使用時(shí)間的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)限定軟件使用時(shí)間的方法,商業(yè)軟件開發(fā)中非常實(shí)用的功能,需要的朋友可以參考下2014-07-07Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果,需要的朋友可以參考下2014-07-07Delphi實(shí)現(xiàn)圖像文本旋轉(zhuǎn)特效完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)圖像文本旋轉(zhuǎn)特效完整實(shí)例代碼,對(duì)于幫助讀者進(jìn)一步理解Delphi圖形及文字特效的處理有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07Delphi之Pascal語言中的關(guān)鍵字及保留字匯總
這篇文章主要介紹了Delphi之Pascal語言中的關(guān)鍵字及保留字匯總,需要的朋友可以參考下2014-07-07