Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解
一.CountDownLatch 和 CyclicBarrier的區(qū)別
CountDownLatch 的計數(shù)器是大于或等于線程數(shù)的,而CyclicBarrier是一定等于線程數(shù)CountDownLatch 放行由其他線程控制而CyclicBarrier是由本身來控制的
二.詳解
CountDownLatch
說明: 一個線程等待其他線程執(zhí)行完之后再執(zhí)行,相當于加強版的join,在初始化CountDownLatch是需要設定計數(shù)器的數(shù)值(計數(shù)器數(shù)據(jù)不一定跟線程數(shù)相同,但是一定計數(shù)器的值一定是要大于等于線程數(shù),一個線程中可以進行多次扣減。當計數(shù)器扣減至0時才可繼續(xù)向下執(zhí)行)
舉例說明:
比如LOL在游戲開始時需要玩家全部準備完畢之后才開始,開始游戲可以理解為“主線程”,玩家準備理解為“其他線程”,在“其他線程”沒有準備完畢之前,“主線程時等待狀態(tài)”,當“其他線程”準備完畢之后“主線程”就會執(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+"準備完成");
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("玩家準備完畢,開始游戲");
}
}
運行結(jié)果
玩家0準備完成
玩家1準備完成
玩家2準備完成
玩家3準備完成
玩家4準備完成
玩家準備完畢,開始游戲
cyclicbarrier
說明: 讓一組線程到達某個屏障,然后被阻塞,一直到最后一個線程到達屏障,然后屏障開放,所有被阻塞的線程繼續(xù)執(zhí)行,計數(shù)器與線程數(shù)相等。
CyclicBarrier(int parties, Runnable barrierAction) 當時使用這個構(gòu)造函數(shù)時,barrierAction定義的任務會執(zhí)行
舉例說明: 假設有一家公司要全體員工進行團建活動,活動內(nèi)容為翻越三個障礙物,每一個人翻越障礙物所用的時間是不一樣的。但是公司要求所有人在翻越當前障礙物之后再開始翻越下一個障礙物,也就是所有人翻越第一個障礙物之后,才開始翻越第二個,以此類推比如跨欄比賽,我們修改一下規(guī)則,當所有選手都跨過第一個欄桿是,才去跨第二個,以此類推,每一個員工都是一個“其他線程”。當所有人都翻越的所有的障礙物之后,程序才結(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之間的隨機整數(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");
}
}
運行結(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個障礙
到此這篇關于Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解的文章就介紹到這了,更多相關Java CountDownLatch CyclicBarrier內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
delphi設置開機自動啟動函數(shù)具體實現(xiàn)
有些程序要設置為開機啟動,所以自己寫了個函數(shù)方便以后使用,實現(xiàn)比較簡單,感興趣的朋友可以參考下哈2013-06-06
在Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像的圖文演示無錯
最近打算學習Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像,網(wǎng)上的好多Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像都是錯誤的,所以我把圖片給弄好了。2008-01-01
Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實例
這篇文章主要介紹了Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實例的相關資料,希望通過本能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09

