java多线程之CyclicBarrier

一、简介

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

你可能感兴趣的:(Java并发和多线程操作,CyclicBarrier)