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