java CyclicBarrier进行并发编程

CyclicBarrier允许一组线程相互等待达到一个公共的障碍点。CyclicBarrier对于一组线程必须相互等待的场景很有用。 比如有一组线程,都要往数据库里面写入操作,只有当所有的线程都往数据库里面写入数据之后,这些线程才能继续往下执行,这时候就可以使用CyclicBarrier了。当所有的等待线程释放之后,CyclicBarrier是可重用的。

CyclicBarrier有两个构造函数:

public CyclicBarrier(int parties, Runnable barrierAction)  


public CyclicBarrier(int parties)   


参数parties指让多少个线程或者任务等待至barrier状态; 参数barrierAction为当这些线程都达到barrier状态时会执行的内容。

对于CyclicBarrier来说,最重要的是await()方法:



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

public class CyclicBarrierTest {
        // 必须等到三个线程都调用c.await()方法时程序才会继续往下走
	static CyclicBarrier c = new CyclicBarrier(3);
	public static void main(String[] args) throws Exception{
		long begin = System.currentTimeMillis();
		AddThread th01 = new AddThread(1, 500000, c);
		AddThread th02 = new AddThread(500001, 1000000, c);
		
		th01.start();
		th02.start();
		// 等待th01和th02执行完成
		c.await();
		System.out.println(th01.getSum()+th02.getSum());
		System.out.println(System.currentTimeMillis()-begin);
	}
}

class AddThread extends Thread{
	
	private long sum ;
	private long begin ;
	private long end ;
	private CyclicBarrier cb ;
	public AddThread(long begin, long end,CyclicBarrier cb) {
		super();
		this.begin = begin;
		this.end = end;
		this.cb = cb ;
	}
	public long getSum() {
		return sum;
	}
	public long getBegin() {
		return begin;
	}
	public void setBegin(long begin) {
		this.begin = begin;
	}
	public long getEnd() {
		return end;
	}
	public void setEnd(long end) {
		this.end = end;
	}
	@Override
	public void run(){
		try {
			// 可以先执行
			for(long i=begin;i<=end;i++){
				sum += i ;
			}
			cb.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}








猜你喜欢

转载自forlan.iteye.com/blog/2391123