CyclicBarrier的介紹

欢乐豆123發表於2024-11-26

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

相關文章