java多線程--同步屏障CyclicBarrier的使用


CyclicBarrier的概念理解:

  CyclicBarrier的字面上的意思是可循環的屏障,是java並發包java.util.concurrent 里的一個同步工具類,在我下載的JDK1.6的中文文檔里對他的解釋是:

  大體意思就是:讓一組線程到達一個屏障,一個集合點時,被阻塞,直到所有的線程都到了這個集合點時,屏障才會打開,然后線程才能繼續往下執行.舉個簡單的例子就是:旅游團帶着一幫人參觀景點,規定在下一個景點A處集合,於是導游就在景點A等着大家,導游就是這個集合點或者說屏障,直到所有的游客集合完畢,導游才會帶着大家繼續參觀下一個景點B.

CyclicBarrier的使用:

  CyclicBarrier有兩個構造函數:

    CyclicBarrier(int parties); int類型的參數表示有幾個線程來參與這個屏障攔截,(拿上面的例子,即有幾個人跟團旅游);

    CyclicBarrier(int parties,Runnable barrierAction);當所有線程到達一個屏障點時,優先執行barrierAction這個線程.

  最重要的一個方法:

    await();每個線程調用await(),表示我已經到達屏障點,然后當前線程被阻塞,(拿上面的例子講就是游客A表示到達了景點A,然后他就在那兒等着大家到齊).

應用場景:

  CyclicBarrier可以用於多線程計算數據,最后合並計算結果的場景,我沒怎么用過這個類,所有只能簡單模擬一個功能.

  需求描述:

假設現在需要計算3個學生的平均成績,
每個學生共有三門成績.
步驟是:先計算出每個學生的平均成績
再根據每個學生的平均成績來計算三個同學的平均成績
使用CyclicBarrier

package com.wang.thread1; import java.util.Set; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 假設現在需要計算3個學生的平均成績, *每個學生共有三門成績 *步驟是:先計算出每個學生的平均成績 *再根據每個學生的平均成績來計算所有有同學的平均成績 *使用CyclicBarrier * @author Administrator * */
public class CyclicBarrier1 implements Runnable{ //創建初始化3個線程的線程池
    private ExecutorService threadPool=Executors.newFixedThreadPool(3); //創建3個CyclicBarrier對象,執行完后執行當前類的run方法
    private CyclicBarrier cb=new CyclicBarrier(3,this); //保存每個學生的平均成績
    private ConcurrentHashMap<String, Integer> map=new ConcurrentHashMap<String,Integer>(); public void count(){ for(int i=0;i<3;i++){ threadPool.execute(new Runnable(){ @Override public void run() { //計算每個學生的平均成績,代碼略()假設為60~100的隨機數
                    int score=(int)(Math.random()*40+60); map.put(Thread.currentThread().getName(), score); System.out.println(Thread.currentThread().getName()+"同學的平均成績為"+score); try { //執行完運行await(),等待所有學生平均成績都計算完畢
 cb.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }); } } @Override public void run() { int result=0; Set<String> set = map.keySet(); for(String s:set){ result+=map.get(s); } System.out.println("三人平均成績為:"+(result/3)+"分"); } public static void main(String[] args) { CyclicBarrier1 cb=new CyclicBarrier1(); cb.count(); } }

打印結果如下:

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM