本部落格系列是學習併發程式設計過程中的記錄總結。由於文章比較多,寫的時間也比較散,所以我整理了個目錄貼(傳送門),方便查閱。
併發程式設計系列部落格傳送門
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() }}
countdownlatch
和cyclicbarrier
功能類似。下面舉個列子來說明下這兩個類的主要區別。
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...