CyclicBarrier是java.util.concurrent包下的并发工具类,通常叫回环栅栏,它的作用跟CountDownLatch很像,但也有很大区别,它是要等到所有线程到达某个点,才能一起向下运行。CyclicBarrier实现主要基于ReentrantLock。
应用场景运动会中等所有运动员就绪后,开始比赛。
运动员(类似于线程)public class Athletes implements Runnable {
private CyclicBarrier cyclicBarrier;
private String name;
public Athletes(CyclicBarrier cyclicBarrier, String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
@Override
public void run() {
System.out.println(name + "就位");
try {
cyclicBarrier.await();
Random random = new Random();
double time = random.nextDouble() + 9;
System.out.println(name + ": " + time);
} catch (Exception e) {
}
}
}
测试类:public class Test01 {
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
public static void main(String[] args) {
List athleteList = new ArrayList<>();
athleteList.add(new Athletes(cyclicBarrier, "博尔特"));
athleteList.add(new Athletes(cyclicBarrier, "鲍威尔"));
athleteList.add(new Athletes(cyclicBarrier, "盖伊"));
athleteList.add(new Athletes(cyclicBarrier, "布雷克"));
athleteList.add(new Athletes(cyclicBarrier, "加特林"));
athleteList.add(new Athletes(cyclicBarrier, "苏炳添"));
athleteList.add(new Athletes(cyclicBarrier, "路人甲"));
athleteList.add(new Athletes(cyclicBarrier, "路人乙"));
Executor executor = Executors.newFixedThreadPool(8);
for (Athletes athlete : athleteList) {
executor.execute(athlete);
}
// 再次比赛(CountDownLatch不可以重复利用)
for (Athletes athlete : athleteList) {
executor.execute(athlete);
}
((ExecutorService) executor).shutdown();
}
}
比赛结果:鲍威尔就位
盖伊就位
博尔特就位
加特林就位
布雷克就位
苏炳添就位
路人甲就位
路人乙就位
博尔特: 9.432140484108947
路人甲: 9.867771637173409
加特林: 9.582797646365496
路人乙: 9.410753732211774
布雷克: 9.422788146940936
鲍威尔: 9.838028130660083
苏炳添: 9.506124200896416
盖伊: 9.120806964021032
路人甲就位
苏炳添就位
加特林就位
布雷克就位
盖伊就位
博尔特就位
鲍威尔就位
路人乙就位
路人乙: 9.368666795856056
路人甲: 9.160379612093944
加特林: 9.165764553853304
博尔特: 9.795900155563556
苏炳添: 9.776369290344261
鲍威尔: 9.322663435858155
盖伊: 9.406014868148848
布雷克: 9.69509705666573可以看到,CyclicBarrier可以循环的使用,重复比赛,这也是CyclicBarrier的特点。
版权所有,转载请标注原文连接:https://www.zhangjianbing.com/archives/56/