1. 程式人生 > >柵欄(CyclicBarrier類)的用法

柵欄(CyclicBarrier類)的用法

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
* 模擬一個工廠, 需要將所有工人數出來的螺釘數目,進行一個合計,
* 有些人數的慢,有些人數的快
* @author jianlong
* @version 2016年1月15日 下午1:09:06
*/
public class CyclicBarrierDemo2 {
private final CyclicBarrier barrier;
private final Worker[] workers;//所有工人
private final int workerNo;//工人的數目
private int readyNum = 0; //完成人數初始化為0

public CyclicBarrierDemo2() {
    workerNo = Runtime.getRuntime().availableProcessors();
    this.barrier = new CyclicBarrier(workerNo,new Runnable() {
        @Override
        public void run() {
            calcNewValues();
        }
    });
    workers = new Worker[workerNo];//初始化工人
    for(int i=0;i<workerNo;i++){
        workers[i] = new Worker();
    }
}
public static void main(String[] args) {
    CyclicBarrierDemo2 cyclicBarrierDemo2 = new CyclicBarrierDemo2();
    //啟動所有工人,開始進行計算
    for(int i=0;i<cyclicBarrierDemo2.workerNo;i++){
        new Thread(cyclicBarrierDemo2.workers[i]).start();
    }
}
/**
 * @author jianlong
 * @version 2016年1月15日 下午1:07:43
 */
protected void calcNewValues() {
    //拿出所有的工人數出來的螺釘,然後統計其數目
    int sum = 0;
    for(int i=0;i<workerNo;i++){
        sum+=workers[i].num;
        System.out.println("第"+i+"位:"+workers[i].num);
    }
    System.out.println("一共有"+sum+"個螺釘");
}
private class Worker implements Runnable{
    private int num;
    @Override
    public void run() {
        //生成隨機數值
        num = new Random().nextInt(100);
        try {
            //生成隨機的停頓時間,模擬工人工作的時間,都是不一樣,最多10秒
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ++readyNum;
        System.out.println("readNum的值是:"+readyNum);
        //while(readyNum!=4){
            //說明還有工人沒有完成,就需要等待? 不需要這麼幹.
            //這個地方不需要進行判斷,因為CyclicBarrier就是幹這個
            //事情的,當等待的人數到達CyclicBarrier建構函式中設定的值後,barrier就會自動開啟柵欄。
            try {
                barrier.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        //}
    }
}

}