前言:
CyclicBarrier翻译过来就是:循环的屏障,这个类是一个可以重复利用的屏障类.
它允许一组线程相互等待,直到全部到达某个公共屏障点,然后所有的这组线程再同步往后执行.
await()函数每被调用依次,计数便会减少1,并阻塞当前线程.当计数减至0,阻塞解除.
CountDownLatch和CyclicBarrier的区别?
1.CountDownLatch的作用是允许1个线程等待其他线程执行完成之后,它才执行;
而CyclicBarrier则是允许N个线程相互等待到某个公共屏障点,然后这一组线程再同时执行.
2.CountDownLatch的计数器的值无法被重置,这个初始值只能被设置一次,是不能够重用的,
CyclicBarrier是可以重用的.
实战:
public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(3,new TotalTask()); BillTask worker1 = new BillTask("111",barrier); BillTask worker2 = new BillTask("222",barrier); BillTask worker3 = new BillTask("333",barrier); worker1.start();worker2.start();worker3.start(); System.out.println("Main thread end!"); } /** * 主任务 */ static class TotalTask extends Thread { @Override public void run() { System.out.println("所有子任务都执行完了,就开始执行主任务"); } } /** * 子任务 */ static class BillTask extends Thread { private String billName; private CyclicBarrier barrier; public BillTask(String workerName,CyclicBarrier barrier) { this.billName = workerName; this.barrier = barrier; } public String getBillName() { return billName; } public void setBillName(String billName) { this.billName = billName; } public CyclicBarrier getBarrier() { return barrier; } public void setBarrier(CyclicBarrier barrier) { this.barrier = barrier; } @Override public void run() { try { System.out.println("市区:"+billName+"运算开始"); //模仿第一次运算 Thread.sleep(1000L); //等待所有线程者调用过此函数才能进行后续动作 barrier.await(); System.out.println("全部结束,市区:"+billName+"才开始后面的工作"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } }
运行结果: