15-循環柵欄CyclicBarrier

CyclicBarrier簡介

CyclicBarrier通常稱爲循環屏障。它和CountDownLatch很相似,都可以使線程先等待然後再執行。不過CountDownLatch是使一批線程等待另一批線程執行完後再執行;而CyclicBarrier只是使等待的線程達到一定數目後再讓它們繼續執行,每調用一次await()方法都將使阻塞的線程數+1,只有阻塞的線程數達到設定值時屏障纔會打開,允許阻塞的所有線程繼續執行.

  • CyclicBarrier的計數器可以重置而CountDownLatch不行,這意味着CyclicBarrier實例可以被重複使用而CountDownLatch只能被使用一次。而這也是循環屏障循環二字的語義所在。

  • CyclicBarrier允許用戶自定義barrierAction操作,這是個可選操作,可以在創建CyclicBarrier對象時指定,一旦用戶在創建CyclicBarrier對象時設置了barrierAction參數,則在阻塞線程數達到設定值屏障打開前,會調用barrierAction的run()方法完成用戶自定義的操作。

    public CyclicBarrier(int parties, Runnable barrierAction) {
        if (parties <= 0) throw new IllegalArgumentException();
        this.parties = parties;
        this.count = parties;
        this.barrierCommand = barrierAction;
    }
    

CountDownLatch和CyclicBarrier的區別

主管相當於 CountDownLatch,幹活的小弟相當於做事情的線程。
老闆交給主管了一個任務,讓主管搞完之後立即上報給老闆。主管下面有10個小弟,接到任務之後將任務劃分爲10個小任務分給每個小弟去幹,主管一直處於等待狀態(主管會調用await()方法,此方法會阻塞當前線程),讓每個小弟幹完之後通知一下主管(調用countDown()方法通知主管,此方法會立即返回),主管等到所有的小弟都做完了,會被喚醒,從await()方法上甦醒,然後將結果反饋給老闆。期間主管會等待,會等待所有小弟將結果彙報給自己。

而CyclicBarrier是一批線程讓自己等待,等待所有的線程都準備好了,自己才能繼續

參考

第17天:JUC中的循環柵欄CyclicBarrier的6種使用場景

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