一、简介
CyclicBarrier也是一个同步辅助类,作用和CountDownLatch几乎一模一样,并没有多大区别,CyclicBarrier是向上记数,CountDownLatch是向下技术。CyclicBarrier和CountDownLatch的区别就是前者计数可以重置。使用CyclicBarrier同样可以实现CountDownLatch能实现的问题。只是CyclicBarrier由于构造方法可以传入一个Runnable,使得它可以更加优雅的使用分治编程技术(尤其在统计方面)。
二、例子
package com.np.ota.test.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 统计某个班级的人数
* @author luke
*/
public class Job implements Runnable{
private CyclicBarrier cyclicBarrier;
private int[] total;//全校总人数
private int index;//哪个班
public Job(CyclicBarrier cyclicBarrier, int[] total, int index) {
this.cyclicBarrier = cyclicBarrier;
this.total = total;
this.index = index;
}
@Override
public void run() {
try {
//统计某个班的人数
total[index] = (int)(Math.random()*100);
System.out.println("class "+index+" number:"+total[index]);
cyclicBarrier.await();//等待其他班级的统计结果
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
package com.np.ota.test.CyclicBarrier;
import java.util.concurrent.CyclicBarrier;
/**
* 有size个班级,分派szie个人去统计各班人数,最后统计全校人数
* @author luke
*
*/
public class Main {
public static void main(String[] args) {
final int size = 9;//全校班级
final int[] allTotal = new int[size];//用数组存放每个班级的人数
CyclicBarrier cyclicBarrier = new CyclicBarrier(size, new Runnable() {
@Override
public void run() {
//统计全校总人数
int n = 0;
for(int i = 0; i < size; i++){
n += allTotal[i];
}
System.out.println(n);
}
});
//派size个人去各个班统计人数
for(int i = 0; i < size; i++){
new Thread(new Job(cyclicBarrier, allTotal, i)).start();
}
}
}
结果:
class 1 number:96
class 5 number:90
class 4 number:76
class 2 number:61
class 0 number:12
class 8 number:94
class 3 number:26
class 6 number:37
class 7 number:37
529