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

Java CountDownLatch與CyclicBarrier及Semaphore使用教程

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

CountDownLatch

CountDownLatch是一個倒數(shù)的計數(shù)器閥門,初始化時閥門關閉,指定計數(shù)的數(shù)量,當數(shù)量倒數(shù)減到0時閥門打開,被阻塞線程被喚醒。

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
    // 總數(shù)是6,必須要執(zhí)行任務的時候,再使用    !
    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(); // 等待計數(shù)器歸零,然后再向下執(zhí)行
    System.out.println("Close Door");
    }
}

原理

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

countDownLatch.await();//等待

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

CyclicBarrier

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

CyclicBarrier也可以像CountDownLatch一樣適用于多個子任務并發(fā)執(zhí)行,當所有子任務都執(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+"個龍珠");
                try {
                cyclicBarrier.await(); // 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Semaphore

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

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();獲得,假設如果已經滿了,等待,等待被釋放為止!

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

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

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

相關文章

  • Java并發(fā)編程之CountDownLatch的使用

    Java并發(fā)編程之CountDownLatch的使用

    CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下
    2023-05-05
  • springboot如何實現(xiàn)自動裝配源碼解讀

    springboot如何實現(xiàn)自動裝配源碼解讀

    這篇文章主要介紹了springboot如何實現(xiàn)自動裝配源碼賞析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java的Map集合中按value值進行排序輸出的實例代碼

    java的Map集合中按value值進行排序輸出的實例代碼

    下面小編就為大家?guī)硪黄猨ava的Map集合中按value值進行排序輸出的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • springboot動態(tài)定時任務的實現(xiàn)方法示例

    springboot動態(tài)定時任務的實現(xiàn)方法示例

    這篇文章主要給大家介紹了關于springboot動態(tài)定時任務的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Spring事務管理詳細講解

    Spring事務管理詳細講解

    事務的作用就是為了保證用戶的每一個操作都是可靠的,事務中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就?回退到事務開始未進行操作的狀態(tài)。事務管理是Spring框架中最為常用的功能之一,我們在使用Spring?Boot開發(fā)應用時,大部分情況下也都需要使用事務
    2022-10-10
  • Java實現(xiàn)線程的四種方式解析

    Java實現(xiàn)線程的四種方式解析

    這篇文章主要介紹了Java實現(xiàn)線程的四種方式解析,線程是進程中的一個執(zhí)行單元,負責當前進程中程序的執(zhí)行,一個進程中至少有一個線程,一個進程中是可以有多個線程的,這個應用程序也可以稱之為多線程程序,需要的朋友可以參考下
    2023-10-10
  • 詳解SpringBoot Starter作用及原理

    詳解SpringBoot Starter作用及原理

    大家都知道基于 SpringBoot 開發(fā)項目可以簡化 Spring 應用的搭建以及開發(fā)過程,提高程序員開發(fā)效率,這是由于其“約定大約配置”的策略及其自動裝配的特點,Starter 就是自動裝配的具體實現(xiàn),本文詳細介紹了SpringBoot Starter作用及原理,歡迎大家來閱讀學習
    2023-04-04
  • Java處理不可見特殊字符要點解析

    Java處理不可見特殊字符要點解析

    這篇文章主要介紹了Java處理不可見特殊字符要點解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • java中的各種修飾符作用及范圍

    java中的各種修飾符作用及范圍

    這篇文章主要介紹了java中的各種修飾符作用及范圍,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java開發(fā)讀取嵌套jar包中的文件

    java開發(fā)讀取嵌套jar包中的文件

    這篇文章主要為大家介紹了java開發(fā)讀取嵌套jar包中的文件方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論