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

Java并發(fā)編程之CountDownLatch解讀

 更新時(shí)間:2023年12月31日 09:07:40   作者:_Romeo  
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch解讀,是通過(guò)一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的,計(jì)數(shù)器的初始值是線程的數(shù)量,countDownLatch這個(gè)類使一個(gè)線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,需要的朋友可以參考下

概念

  • countDownLatch這個(gè)類使一個(gè)線程等待其他線程各自執(zhí)行完畢后再執(zhí)行。
  • 是通過(guò)一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的,計(jì)數(shù)器的初始值是線程的數(shù)量。每當(dāng)一個(gè)線程執(zhí)行完畢后,計(jì)數(shù)器的值就-1,當(dāng)計(jì)數(shù)器的值為0時(shí),表示所有線程都執(zhí)行完畢,然后在閉鎖上等待的線程就可以恢復(fù)工作了。

源碼

countDownLatch類中只提供了一個(gè)構(gòu)造器:

//參數(shù)count為計(jì)數(shù)值
public CountDownLatch(int count) {  };  

類中有三個(gè)方法是最重要的:

//調(diào)用await()方法的線程會(huì)被掛起,它會(huì)等待直到count值為0才繼續(xù)執(zhí)行
public void await() throws InterruptedException { };   
//和await()類似,只不過(guò)等待一定的時(shí)間后count值還沒(méi)變?yōu)?的話就會(huì)繼續(xù)執(zhí)行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//將count值減1
public void countDown() { };  

自定義實(shí)現(xiàn)一個(gè)CountDownLatch

代碼如下:

public class KaneCountDownLatch {
    private KaneCountDownLatch.Sync sync;
    public KaneCountDownLatch(int count) {
        this.sync = new KaneCountDownLatch.Sync(count);
    }
    public void countDown() {
        this.sync.releaseShared(1);
    }
    public void await() {
        this.sync.acquireShared(1);
    }
    class Sync extends AbstractQueuedSynchronizer {
        public Sync(int count) {
            this.setState(count);
        }
        protected int tryAcquireShared(int arg) {
            return this.getState() == 0 ? 1 : -1;
        }
        protected boolean tryReleaseShared(int arg) {
            int c;
            int nextc;
            do {
                c = this.getState();
                if (c == 0) {
                    return false;
                }
                nextc = c - 1;
            } while(!this.compareAndSetState(c, nextc));
            return nextc == 0;
        }
    }
}

測(cè)試代碼如下:

public class CountDownLatch_Demo {
    public static void main(String[] args) throws InterruptedException {
        KaneCountDownLatch latch = new KaneCountDownLatch(6); //計(jì)數(shù)為6
        for (int i = 0; i <6 ; i++) {
            new Thread(()->{
                System.out.println("開始準(zhǔn)備.....");
                latch.countDown();//計(jì)數(shù)減一
            }).start();
            Thread.sleep(1000);
        }
        latch.await(); //每個(gè)線程執(zhí)行一次,則-1,在latch為0的時(shí)候開始向下運(yùn)行 這是這些線程都準(zhǔn)備就緒,然后去一起干同一件事
        //還有一種方式, 將一個(gè)活分為多段,每個(gè)線程去干一段
//        for (int i = 0; i <6 ; i++) {
//            new Thread(()->{
//                  latch.countDown(); // 計(jì)數(shù)減一
//                try {
//                    latch.await(); // 阻塞 -- > 0
//                    System.out.println("線程:"+Thread.currentThread().getName()+"執(zhí)行完畢");
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }).start();
//        }
        System.out.println("開始干活....");
    }
}

CountDownLatch和CyclicBarrier區(qū)別

  • countDownLatch是一個(gè)計(jì)數(shù)器,線程完成一個(gè)記錄一個(gè),計(jì)數(shù)器遞減,只能只用一次
  • CyclicBarrier的計(jì)數(shù)器更像一個(gè)閥門,需要所有線程都到達(dá),然后繼續(xù)執(zhí)行,計(jì)數(shù)器遞增,提供reset功能,可以多次使用

到此這篇關(guān)于Java并發(fā)編程之CountDownLatch解讀的文章就介紹到這了,更多相關(guān)CountDownLatch解讀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式

    SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式

    這篇文章主要介紹了SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MyBatis深入解讀動(dòng)態(tài)SQL的實(shí)現(xiàn)

    MyBatis深入解讀動(dòng)態(tài)SQL的實(shí)現(xiàn)

    動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過(guò) JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài) SQL,可以徹底擺脫這種痛苦
    2022-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解

    Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解

    這篇文章通過(guò)實(shí)例面試題目來(lái)講解Java中Map和Set之間的關(guān)系,具有很好的參考價(jià)值,Map與Set在面試中經(jīng)常會(huì)遇到。一起跟隨小編過(guò)來(lái)看看吧
    2022-01-01
  • Java多線程處理文件的示例詳解

    Java多線程處理文件的示例詳解

    在Java編程中,文件處理是一項(xiàng)常見(jiàn)的任務(wù),為了提高文件處理的效率,我們可以使用多線程技術(shù),本文將詳細(xì)介紹如何使用Java多線程來(lái)處理文件,需要的可以參考下
    2024-12-12
  • java分割文本字符串的方法

    java分割文本字符串的方法

    這篇文章主要為大家詳細(xì)介紹了java分割文本字符串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java防止代碼被動(dòng)態(tài)篡改的解決方案和代碼示例

    Java防止代碼被動(dòng)態(tài)篡改的解決方案和代碼示例

    在Java中,反射攻擊是一種通過(guò)動(dòng)態(tài)訪問(wèn)或修改類、方法、字段等私有成員的攻擊方式,可能導(dǎo)致敏感數(shù)據(jù)泄露、權(quán)限繞過(guò)或系統(tǒng)崩潰,為了防止代碼被動(dòng)態(tài)篡改,需要從 訪問(wèn)控制、輸入驗(yàn)證、安全機(jī)制、代碼加固 等多方面入手,以下是詳細(xì)的解決方案和代碼示例
    2025-07-07
  • Java8中接口的新特性測(cè)試

    Java8中接口的新特性測(cè)試

    今天小編就為大家分享一篇關(guān)于Java8中接口的新特性測(cè)試,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • java 詳解類加載器的雙親委派及打破雙親委派

    java 詳解類加載器的雙親委派及打破雙親委派

    這篇文章主要介紹了java 詳解類加載器的雙親委派及打破雙親委派的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的酒店前臺(tái)管理小功能(實(shí)例代碼)

    Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的酒店前臺(tái)管理小功能(實(shí)例代碼)

    這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的酒店前臺(tái)管理小功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java concurrency線程池之線程池原理(二)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency線程池之線程池原理(二)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Java concurrency線程池之線程池原理第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評(píng)論

萍乡市| 噶尔县| 渭源县| 澳门| 拜城县| 远安县| 平和县| 平昌县| 太康县| 沂源县| 沂源县| 巴塘县| 建平县| 台东县| 道真| 龙岩市| 游戏| 义马市| 青铜峡市| 普定县| 泾川县| 响水县| 都江堰市| 濉溪县| 道孚县| 招远市| 巴林右旗| 赞皇县| 长宁区| 鸡东县| 梅河口市| 龙南县| 墨竹工卡县| 阳江市| 安阳县| 冷水江市| 忻城县| 筠连县| 扬州市| 湟中县| 汕尾市|