java之併發工具類計數器(CountDownLatch)

java併發工具類
1、CountDownLatch :能夠使一個或多個線程等待其他線程完成各自的工作後再執行
2、CyclicBarrier : 讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障纔會開門,所有被屏障攔截的線程纔會繼續運行。
3、Semaphore : 用來控制同時訪問特定資源的線程數量,它通過協調各個線程,以保證合理地使用公共資源
4、Exchanger  : 用於線程間協作的工具類

1、CountDownLatch(倒計時 門栓):讓一些線程阻塞直到另一些線程完成一系列操作後才喚醒。 
白話理解:比如一輛拉客麪包車,車裏能做5個人,司機等到5個都坐上來了纔可以發車。
實現:它通過調用await方法讓線程進入阻塞狀態等待倒計時0時喚醒。
它通過線程調用countDown方法讓倒計時中的計數器減去1,當計數器爲0時,會喚醒哪些因爲調用了await而阻塞的線程。
底層實現:
底層是使用AQS實現的

案列:假設老闆開一個緊急會議,他先到會議室等着所有人簽到然後開始開會,可以使用CountDownLatch進行模擬。

public static void main(String[] args) {
    CountDownLatch countDownLatch=new CountDownLatch(5);

    for (int i=1;i<=5;i++){
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"簽到!");
            countDownLatch.countDown();
        },"第"+i+"個人").start();
    }


    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("老闆宣佈人夠了開始開會!");
}

運行結果如下:

第1個人簽到!
第2個人簽到!
第5個人簽到!
第4個人簽到!
第3個人簽到!
老闆宣佈人夠了開始開會!

重點: 場景1:當多線程併發情況下,如果有四個線程,前三個線程併發執行完纔可以執行最後一個線程,那麼可以使用CountDownLatch來實現
    場景2:當多線程情況下,如果有四個線程,要按照順序一個一個執行,那麼也可以使用CountDownLatch來實現
     
場景2實戰地址:https://www.cnblogs.com/wenjunwei/p/10573289.html 

其他博客參考:https://www.cnblogs.com/wangsen/p/11170709.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章