CyclicBarrier的介紹
概要
CyclicBarrier(迴圈柵欄/迴圈屏障)是java.util.concurrent工具類裡的一個工具,它是Java提供的一種特定場景下的多執行緒之間進行互動的使用方法。
CyclicBarrier 作用是讓一組執行緒相互等待,當達到一個共同點時,所有之前等待的執行緒再繼續執行,且 CyclicBarrier 功能可重複使用。
如下圖:
一、案例介紹
舉個例子,比如小明,小美,小華,小麗幾人終於歷經多年課本出題歷程,高考結束,相約一起聚餐,然而他們每個人到達約會地點的耗時都一樣,有的人會早到,有的人會晚到,但是他們要都到了以後才可以決定點那些菜。
這個時候我們就可以使用JUC包中為我們提供了一個同步工具類來模擬這類場景,CyclicBarrier,利用CyclicBarrier類可以實現一組執行緒相互等待,當所有執行緒都到達某個屏障點後再進行後續的操作。這裡每個人相當於一個執行緒,而餐廳就是 CyclicBarrier。
介紹:CyclicBarrier可以使一定數量的執行緒反覆地在柵欄位置處彙集。當執行緒到達柵欄位置時將呼叫await方法,這個方法將阻塞直到所有執行緒都到達柵欄位置。如果所有執行緒都到達柵欄位置,那麼柵欄將開啟,此時所有的執行緒都將被釋放,而柵欄將被重置以便下次使用。
CyclicBarrier字面意思是"可重複使用的柵欄",CyclicBarrier 和 CountDownLatch 很像,只是 CyclicBarrier 可以有不止一個柵欄,因為它的柵欄(Barrier)可以重複使用(Cyclic)。
二、建構函式
public CyclicBarrier(int parties) { this(parties, null); } public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); this.parties = parties; this.count = parties; this.barrierCommand = barrierAction; }
parties 是參與執行緒的個數,每個執行緒使用await()方法告訴CyclicBarrier我已經到達了屏障,然後當前執行緒被阻塞。
第二個構造方法有一個 Runnable 引數,這個引數的意思是,執行緒到達屏障時,優先執行barrierAction,方便處理更復雜的業務場景。
await方法:
三、CyclicBarrier和CountDownLatch的區別
1. 計數器使用的次數
CountDownLatch的計數器只能使用一次,而CyclicBarrier的計數器可以使用reset()方法重置,可以使用多次,所以CyclicBarrier能夠處理更為複雜的場景;
2. 用途
CountDownLatch允許一個或多個執行緒等待一組事件的產生,而CyclicBarrier用於等待其他執行緒執行到柵欄位置。
3. 額外功能
CyclicBarrier還提供了一些其他有用的方法,比如getNumberWaiting()方法可以獲得CyclicBarrier阻塞的執行緒數量,isBroken()方法用來了解阻塞的執行緒是否被中斷;
參考連結:
https://juejin.cn/post/6977549754217529358