概念
cyclicBarrier的字面意思时可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法
例子
收集七龙珠,只有七颗龙珠收齐了才能召唤神龙,没得到七颗之前,其他得到的龙珠只能先放好,等到七颗收起完成才能一起召唤
代码实现
- new CyclicBarrier();第一个参数(即7)表示等待的线程数,第二个参数(即
()->{System.out.println("****集齐龙珠,召唤神龙****");})是达到7个后执行的方法,即构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务 - 线程调用 await() 表示自己已经到达栅栏
- BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时
package com.bowen;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("****集齐龙珠,召唤神龙****");});for (int i = 1; i <= 7; i++) {final int temp = i;new Thread(()->{System.out.println("集到第"+temp+"颗龙珠");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}},String.valueOf(i)).start();}}}//结果//集到第6颗龙珠//集到第2颗龙珠//集到第3颗龙珠//集到第5颗龙珠//集到第7颗龙珠//集到第1颗龙珠//集到第4颗龙珠//****集齐龙珠,召唤神龙****