併發工具 CyclicBarrier

2022-01-10 05:53:34 字數 2414 閱讀 7304

本部落格系列是學習併發程式設計過程中的記錄總結。由於文章比較多,寫的時間也比較散,所以我整理了個目錄貼(傳送門),方便查閱。

併發程式設計系列部落格傳送門

cyclicbarrier也是jdk並發包中提供的乙個輔助併發工具類。cyclicbarrier的作用是讓一組執行緒互相等待,直到這組執行緒中所有的執行緒

都到達同步點(完成某個動作,體現到api上就是呼叫cyclicbarrier的await方法),這些執行緒才會繼續往下工作。

在相互等待的執行緒被釋放後,cyclicbarrier可以被迴圈使用。這個從這個類的名字中的cyclic就可以看出。

public cyclicbarrier(int parties) 

public cyclicbarrier(int parties, runnable barrieraction)

cyclicbarrier提供了兩個建構函式。乙個建構函式只是指定相互等待的執行緒個數,另外乙個建構函式指定了互相等待的執行緒個數,還指定了

柵欄開啟之後會觸發的動作。

下面的**模擬了乙個解析excel的過程:這個excel有5個sheet,使用5個執行緒分別去解析這個5個sheet,等5個執行緒全部解析完成後列印出解析結果。

public class cyclicbarriertest 

}private static class worker implements runnable

@override

public void run() catch (interruptedexception e) catch (brokenbarrierexception e)

}private int processdata(int originaldata)

}private static class summaryclerker implements runnable

@override

public void run() }}

countdownlatchcyclicbarrier功能類似。下面舉個列子來說明下這兩個類的主要區別。

countdownlatch更加強調一組執行緒等待另外一組執行緒。還是那之前的場景舉例:

小王和他老婆分別請了他們的同事來家裡吃晚飯,一共請了6個同事。他們會一直等到6個同時全都到齊了才開始吃晚飯。

這個場景中,小王和他老婆就是執行緒組a,他們的6個同事就是執行緒組b,執行緒組a的執行緒會一直await,知道執行緒組b的6個同事全部到達,呼叫countdown

cyclicbarrier更加強調一組執行緒之間的互相等待。

小王和公司戶外俱樂部的同事相約去爬佘山。他們相約在景區入口處集合,等全部的人都到齊後再一起去爬山。這個景區入口就是乙個同步點(柵欄),所有

同事都到齊後這個柵欄會開啟。

countdownlatch計數歸零後就不能重複利用了,但是cyclicbarrier可以reset進行重複利用。

cyclicbarrier源**比較簡單,這邊就不具體分析源**了。

總的來說,cyclicbarrier的主要功能是一組執行緒互相等待,執行緒全部到達同步點後這些執行緒才繼續往下工作。

實現的原理是:先到達的執行緒呼叫condition的await方法,進入waiting狀態。最後乙個到達的執行緒會呼叫signalall方法喚醒所有執行緒繼續往下工作。

乙個小坑

cyclicbarrier的reset方法有乙個小坑需要我們注意下。

在呼叫reset之後,只會重置已經到達屏障的執行緒(已經呼叫await的執行緒)因此會存在乙個問題(下面還是以爬山的列子說明這個問題):

兩撥人相約去爬山,每波人20個。第一撥人約定上午9點在景區門口集合,第二波人約定10點左右集合。

第一波人中,19個人在9點左右都到達了景區門口了,但是剩下的乙個人因為堵車而沒來的及趕到。這19個人就在景區門口一直等這個遲到的同事。突然在等的過程中,有個同事身體不舒服,就提議取消這次活動,所以大家都散了。

但是堵車的那個同事還沒到,也沒人通知他活動取消了。他匆匆忙忙終於還是在9點40左右到達了,但是現在他已經分不清自己是第一波人還是第二波人了,第二波人也不知道這個人其實是屬於第一波人的。所以只要第二波人中來了19個人他們就開始去爬山了。

第二波人中最後乙個到達的會一直在那等待其他的19個人,但實際上他們已經去爬山了。

其實這種情況可以給執行緒設定乙個超時時間來解決。在這個場景中的體現就是,每個人只等待30分鐘,還沒到期就打道回府。

多執行緒 併發工具類之CyclicBarrier詳解

從字面意思理解,cyclicbarrier是回環屏障的意思,它可以讓一組執行緒全部達到乙個狀態後再全部同時執行。這裡之所以叫作回環是因為當所有等待執行緒執行完畢,並重置cyclicbarrier 的狀態後它可以被重用。之所以叫作屏障是因為執行緒呼叫await 方法後就會被阻塞,這個阻塞點就稱為屏障點...

Java併發程式設計之CyclicBarrier

cyclicbarrier是乙個同步工具類,它允許一組執行緒互相等待,直到到達某個公共屏障點。與countdownlatch不同的是該barrier在釋放等待執行緒後可以重用,所以稱它為迴圈 cyclic 的屏障 barrier cyclicbarrier支援乙個可選的runnable命令,在一組執...

Java併發程式設計之CyclicBarrier

cyclicbarrier執行一組執行緒相互等待,直到到達某個公共的屏障點。它是通過計數器來實現的,當某個執行緒呼叫了await 方法後,該執行緒就進入了等待狀態,計數器執行加1操作,當計數器的值達到了設定的初始值的時候,呼叫await 進入等待狀態的執行緒會被喚醒,繼續執行他們後續的操作。由於cy...