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

Java CountDownLatch與CyclicBarrier及Semaphore使用教程

 更新時(shí)間:2023年01月04日 08:34:48   作者:欲無緣  
對于并發(fā)執(zhí)行,Java中的CountDownLatch是一個(gè)重要的類。為了更好的理解CountDownLatch這個(gè)類,本文將通過例子和源碼帶領(lǐng)大家深入解析CountDownLatch與CyclicBarrier及Semaphore的原理,感興趣的可以學(xué)習(xí)一下

CountDownLatch

CountDownLatch是一個(gè)倒數(shù)的計(jì)數(shù)器閥門,初始化時(shí)閥門關(guān)閉,指定計(jì)數(shù)的數(shù)量,當(dāng)數(shù)量倒數(shù)減到0時(shí)閥門打開,被阻塞線程被喚醒。

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
    // 總數(shù)是6,必須要執(zhí)行任務(wù)的時(shí)候,再使用    !
    CountDownLatch countDownLatch = new CountDownLatch(6);
    for (int i = 1; i <=6 ; i++) {    
        new Thread(()->{
        System.out.println(Thread.currentThread().getName()+" Go out");
        countDownLatch.countDown(); // 數(shù)量-1
        },String.valueOf(i)).start();
    }  
    countDownLatch.await(); // 等待計(jì)數(shù)器歸零,然后再向下執(zhí)行
    System.out.println("Close Door");
    }
}

原理

countDownLatch.countDown();//數(shù)量-1

countDownLatch.await();//等待

每次有線程調(diào)用 countDown() 數(shù)量-1,假設(shè)計(jì)數(shù)器變?yōu)?,countDownLatch.await() 就會被喚醒,繼續(xù)執(zhí)行!

CyclicBarrier

CyclicBarrier是一個(gè)可循環(huán)的屏障,它允許多個(gè)線程在執(zhí)行完相應(yīng)的操作后彼此等待共同到達(dá)一個(gè)point,等所有線程都到達(dá)后再繼續(xù)執(zhí)行。

CyclicBarrier也可以像CountDownLatch一樣適用于多個(gè)子任務(wù)并發(fā)執(zhí)行,當(dāng)所有子任務(wù)都執(zhí)行完后再繼續(xù)接下來的工作。

public class CyclicBarrierDemo {
    public static void main(String[] args) {
         // 召喚龍珠的線程
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召喚神龍成功!");
        });
        for (int i = 1; i <=7 ; i++) {
            final int temp = i;
            // lambda能操作到 i 嗎
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"收集"+temp+"個(gè)龍珠");
                try {
                cyclicBarrier.await(); // 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Semaphore

Semaphore翻譯過來是信號量的意思,它的作用是控制多個(gè)線程對同一個(gè)資源的訪問線程數(shù)量。比如在停車場停車,里面有10個(gè)車位,當(dāng)這10個(gè)車位被停滿的時(shí)候其他的車只能等待(堵塞)里面有車駛出(release)然后再進(jìn)入。

public class SemaphoreDemo {
    public static void main(String[] args) {
        // 線程數(shù)量:停車位! 限流!
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <=6 ; i++) {
            new Thread(()->{
            // acquire() 得到
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName()+"搶到車位");
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName()+"離開車位");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release(); // release() 釋放
            }
        },String.valueOf(i)).start();
        }
    }
}

semaphore.acquire();獲得,假設(shè)如果已經(jīng)滿了,等待,等待被釋放為止!

semaphore.release();釋放,會將當(dāng)前的信號量釋放 + 1,然后喚醒等待的線程!

作用: 多個(gè)共享資源互斥的使用!并發(fā)限流,控制最大的線程數(shù)!

到此這篇關(guān)于Java CountDownLatch與CyclicBarrier及Semaphore使用教程的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis中關(guān)于mapper的使用以及注意事項(xiàng)

    mybatis中關(guān)于mapper的使用以及注意事項(xiàng)

    這篇文章主要介紹了mybatis中關(guān)于mapper的使用以及注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java中簡單的截取分割字符串實(shí)例

    java中簡單的截取分割字符串實(shí)例

    下面小編就為大家?guī)硪黄猨ava中簡單的截取分割字符串實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 使用Swagger時(shí)Controller中api接口顯示不全的問題分析及解決

    使用Swagger時(shí)Controller中api接口顯示不全的問題分析及解決

    swagger是一個(gè)十分好用的api接口管理、測試框架,現(xiàn)在越來越多的人使用這個(gè)做接口的測試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問題,所以本文給大家詳細(xì)分析了問題以及解決方法,需要的朋友可以參考下
    2024-02-02
  • 解決JPA @OneToMany及懶加載無效的問題

    解決JPA @OneToMany及懶加載無效的問題

    這篇文章主要介紹了解決JPA @OneToMany及懶加載無效的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解

    Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開發(fā)工作中,我們時(shí)常會遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺的銷售報(bào)表等等,需要的朋友可以參考下
    2023-08-08
  • springboot單元測試兩種方法實(shí)例詳解

    springboot單元測試兩種方法實(shí)例詳解

    這篇文章主要介紹了springboot單元測試兩種方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場景

    淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場景

    數(shù)組可以存放多個(gè)同一類型的數(shù)據(jù),可以存儲基本數(shù)據(jù)類型,引用數(shù)據(jù)類型(對象),下面這篇文章主要給大家介紹了關(guān)于Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場景,需要的朋友可以參考下
    2022-11-11
  • SpringBoot?基于?MongoTemplate?的工具類過程詳解

    SpringBoot?基于?MongoTemplate?的工具類過程詳解

    MongoDB是一個(gè)高性能,開源,無模式的文檔型數(shù)據(jù)庫,是當(dāng)前NoSql數(shù)據(jù)庫中比較熱門的一種,這篇文章主要介紹了SpringBoot基于MongoTemplate的工具類,需要的朋友可以參考下
    2023-09-09
  • Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)代碼

    Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)代碼

    這篇文章主要給大家介紹了關(guān)于Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)的相關(guān)資料,在SpringBoot項(xiàng)目中通常我們沒有處理并發(fā)問題,但是使用項(xiàng)目本身還是支持一定的并發(fā)量,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解

    關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解

    這篇文章主要介紹了對spring事務(wù)傳播行為非事務(wù)方式的全面理解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

含山县| 合作市| 红原县| 盐池县| 栖霞市| 招远市| 淮南市| 灵璧县| 建平县| 屏东县| 东阿县| 桑植县| 甘泉县| 麻栗坡县| 洛浦县| 襄汾县| 东乡| 土默特右旗| 临武县| 呼伦贝尔市| 佳木斯市| 赣榆县| 乌恰县| 津南区| 阳春市| 湘阴县| 荃湾区| 巴青县| 鲁山县| 肇源县| 武鸣县| 宁国市| 同心县| 明水县| 高要市| 申扎县| 滦南县| 绥化市| 光山县| 成都市| 民勤县|