最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解

 更新時間:2023年11月12日 15:03:31   作者:Wl_皮囊  
CountDownLatch和CyclicBarrier是Java并發(fā)包提供的兩個非常易用的線程同步工具類,本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

民丰县| 澄迈县| 商城县| 武陟县| 苍溪县| 武宣县| 淳安县| 洛阳市| 合作市| 乌海市| 贵溪市| 乐业县| 怀柔区| 莫力| 延庆县| 宝丰县| 牡丹江市| 儋州市| 贵南县| 大荔县| 旬邑县| 山西省| 雷山县| 镇坪县| 兴海县| 英超| 肥乡县| 项城市| 海口市| 光山县| 颍上县| 武城县| 乌拉特后旗| 万安县| 油尖旺区| 道孚县| 开封县| 稻城县| 正蓝旗| 辉县市| 洪雅县|