android 面试题 CyclicBarrier

 CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。

  CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用

 

CyclicBarrier和CountDownLatch有相似之处是都要等某组任务完成才能执行某个操作, 不同之处是CountDownLatch是进行减法,而CyclicBarrier是进行加法,写例子最好说明:
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Runnable() {
              @Override
             public void run() {
                    System.out.println(" 开会了,关于项目的功能分析");
             }
         });
        Person p = new Person(cyclicBarrier);
        Thread t1 = new Thread(p,"java后台");
        Thread t2 = new Thread(p,"测试人员");
        Thread t3 = new Thread(p,"项目经理");
        Thread t4 = new Thread(p,"设计师");
        Thread t5 = new Thread(p,"Android程序员");
        List<Thread> threadList = new ArrayList<>();
        threadList.add(t1);
        threadList.add(t2);
        threadList.add(t3);
        threadList.add(t4);
        threadList.add(t5);
        for(Thread thread:threadList){
            thread.start();
        }
    }
}
class Person implements Runnable{
    private CyclicBarrier cyclicBarrier;
    public Person(CyclicBarrier cyclicBarrier){
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        try {
           int random =  (int)(1+Math.random()*2000);
            Thread.sleep(random);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"进入会议室");
        try {
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

结果:

java后台进入会议室
测试人员进入会议室
Android程序员进入会议室
项目经理进入会议室
设计师进入会议室
 开会了,关于项目的功能分析

 

上一篇:Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)


下一篇:使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑