欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年11月12日 15:03:31   作者:Wl_皮囊  
CountDownLatch和CyclicBarrier是Java并發(fā)包提供的兩個(gè)非常易用的線程同步工具類,本文主要介紹了Java中CountDownLatch和CyclicBarrier的區(qū)別與詳解,具有一定的參考價(jià)值,感興趣的可以了解一下

一.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)文章

最新評(píng)論