Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解
一.CountDownLatch 和 CyclicBarrier的區(qū)別
CountDownLatch 的計數(shù)器是大于或等于線程數(shù)的,而CyclicBarrier是一定等于線程數(shù)CountDownLatch 放行由其他線程控制而CyclicBarrier是由本身來控制的
二.詳解
CountDownLatch
說明: 一個線程等待其他線程執(zhí)行完之后再執(zhí)行,相當(dāng)于加強(qiáng)版的join,在初始化CountDownLatch是需要設(shè)定計數(shù)器的數(shù)值(計數(shù)器數(shù)據(jù)不一定跟線程數(shù)相同,但是一定計數(shù)器的值一定是要大于等于線程數(shù),一個線程中可以進(jìn)行多次扣減。當(dāng)計數(shù)器扣減至0時才可繼續(xù)向下執(zhí)行)
舉例說明:
比如LOL在游戲開始時需要玩家全部準(zhǔn)備完畢之后才開始,開始游戲可以理解為“主線程”,玩家準(zhǔn)備理解為“其他線程”,在“其他線程”沒有準(zhǔn)備完畢之前,“主線程時等待狀態(tài)”,當(dāng)“其他線程”準(zhǔn)備完畢之后“主線程”就會執(zhí)行下一步開始游戲的動作

代碼示例
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á)某個屏障,然后被阻塞,一直到最后一個線程到達(dá)屏障,然后屏障開放,所有被阻塞的線程繼續(xù)執(zhí)行,計數(shù)器與線程數(shù)相等。
CyclicBarrier(int parties, Runnable barrierAction) 當(dāng)時使用這個構(gòu)造函數(shù)時,barrierAction定義的任務(wù)會執(zhí)行
舉例說明: 假設(shè)有一家公司要全體員工進(jìn)行團(tuán)建活動,活動內(nèi)容為翻越三個障礙物,每一個人翻越障礙物所用的時間是不一樣的。但是公司要求所有人在翻越當(dāng)前障礙物之后再開始翻越下一個障礙物,也就是所有人翻越第一個障礙物之后,才開始翻越第二個,以此類推比如跨欄比賽,我們修改一下規(guī)則,當(dāng)所有選手都跨過第一個欄桿是,才去跨第二個,以此類推,每一個員工都是一個“其他線程”。當(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 +"個障礙");
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個障礙
選手2翻過了第1個障礙
選手1翻過了第1個障礙
選手5翻過了第1個障礙
選手3翻過了第1個障礙
選手1翻過了第2個障礙
選手4翻過了第2個障礙
選手3翻過了第2個障礙
選手5翻過了第2個障礙
選手2翻過了第2個障礙
選手5翻過了第3個障礙
選手2翻過了第3個障礙
選手1翻過了第3個障礙
選手4翻過了第3個障礙
選手3翻過了第3個障礙
到此這篇關(guān)于Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解的文章就介紹到這了,更多相關(guān)Java CountDownLatch CyclicBarrier內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
delphi中exit,abort,break,continue的區(qū)別介紹
本文詳細(xì)介紹下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的區(qū)別,感興趣的朋友可以參考下哈,希望對你學(xué)習(xí)跳出有所幫助2013-04-04
Delphi實現(xiàn)圖像文本旋轉(zhuǎn)特效完整實例代碼
這篇文章主要介紹了Delphi實現(xiàn)圖像文本旋轉(zhuǎn)特效完整實例代碼,對于幫助讀者進(jìn)一步理解Delphi圖形及文字特效的處理有一定的借鑒價值,需要的朋友可以參考下2014-07-07
Delphi之Pascal語言中的關(guān)鍵字及保留字匯總
這篇文章主要介紹了Delphi之Pascal語言中的關(guān)鍵字及保留字匯總,需要的朋友可以參考下2014-07-07

