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