CyclicBarrier是什么?
字面意思循环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。
叫做循环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
叫做栅栏,是描述所有线程被栅栏挡住了,当都达到时,一起跳过栅栏执行,也算形象。我们可以
把这个状态就叫做barrier。
CyclicBarrier如何使用和工作?
看下API
CyclicBarrier有两个构造函数
public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
第一个参数,表示那个一起执行的线程个数。
第二个参数,表示线程都处于barrier时,一起执行之前,先执行的一个线程。
让线程处于barrier状态的方法await()
public int await()
public int await(long timeout, TimeUnit unit)
第一个默认方法,表示要等到所有的线程都处于barrier状态,才一起执行
第二个方法,指定了等待的时间,当所有线程没有都处于barrier状态,又到了指定的时间,所在的线程
就继续执行了。
CyclicBarrier应用场景例子
举个报旅行团旅行的例子。
出发前,导游会在机场收了护照和签证,办理集体出境手续,所以,要等大家都到齐才能出发,出发
前再把护照和签证发到大家手里。
对应CyclicBarrier使用。每个人到达后进入barrier状态。都到达后,唤起大家一起出发去旅行。旅行出发前,导游还会有个发护照和签证的动作。
与CountDownLatch区别?
CountDownLatch只能使用一次,而CyclicBarrier可以重复使用。比如多线程计算时,可以设置更
合理的线程数,同时每个线程仅需要处理合理的计算任务,不必担心内存溢出,减少线程上下文切
换带来的性能开销。类似小步快跑的意思。
CountDownLatch 基于 AQS 的共享模式实现。 CyclicBarrier 基于 Condition 来实现。
CountDownLatch 计数由使用者控制,CyclicBarrier 的计数由自己控制。
CyclicBarrier 由于是循环的,所以多任务计算时可以实现结果是累加变化的一个过程,而不是只有
一个不变的最终结果。