栅栏(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();
            }
        //}
    }
}

}

猜你喜欢

转载自blog.csdn.net/jianlong1284537512/article/details/50523342