CyclicBarrier

可循环的屏障,它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续生活,线程进入屏障CyclicBarrier的await()方法。

一个线程组的线程需要等待所有线程完成任务后再继续执行下次任务。

构造方法

public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
  • parties是参与线程的个数
  • 第二个构造方法有一个Runnable参数,这个参数是最后一个到达线程要做的任务。

重要方法

public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
  • 线程调用await()表示自己已经到达栅栏
  • BrokenBarrierException表示栅栏已经被破坏,破坏的原因可能是其中一个线程await()时被中断或者超时。
public class CycliBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙");
});

for (int i = 1; i <=7 ; i++) {
final int tempInt=i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 收集第"+tempInt+"颗龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t 开始许第"+tempInt+"个愿");
},String.valueOf(i)).start();
}
}
}

结果:

 下图是CycliBarier的过程

 

 CycliBarrier与CountDownLatch区别:

  • CountDownLatch是一次性的,CyclicBarrier可循环利用的。
  • CountDownLatch参与的线程的职责是不一样的,有的在倒计时,有的在等待倒计时结束。CyclicBarrier参与的线程职责是一样的。

 

 posted on 2020-12-09 16:27  会飞的金鱼  阅读(127)  评论(0)    收藏  举报