并发编程 - CyclicBarrier

CyclicBarrier 循环栅栏

CyclicBarrier 相对比CoundDownLatch强大且复杂
下面模拟士兵集合、执行任务等操作

Soldier - 士兵

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 模块:【CyclicBarrier - 士兵】
 * 

* 开发: Bruce.Liu By 2018/9/3 下午8:54 Create */ public class Soldier implements Runnable { //定义名称 private String soldierName; private final CyclicBarrier cyclic; /** * 构造函数 */ public Soldier(CyclicBarrier cyclic, String soldierName) { this.cyclic = cyclic; this.soldierName = soldierName; } @Override public void run() { try { //执行阻塞等待,等所有人到期 cyclic.await(); //所有人到齐后开始执行任务 doWork(); //执行阻塞等待,等待所有人执行任务完成 cyclic.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } /** * 士兵开始执行任务 */ void doWork() { try { Thread.sleep(Math.abs(new Random().nextInt() % 10000)); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println(soldierName + " - 任务执行完成!"); } }

BarrierRun - 司令

CyclicBarrier 可以接首一个参数作为barrier,这里即当前定义的BarrierRun,
每当barrier计数器循环一次完成(例10个完成后)后会执行,
可以参考执行结果。

/**
 * 模块:【CyclicBarrier - 司令】
 * 

* 开发: Bruce.Liu By 2018/9/3 下午9:04 Create */ public class BarrierRun implements Runnable { boolean flag ; Integer n ; public BarrierRun(boolean flag, Integer n) { this.flag = flag; this.n = n; } @Override public void run() { if(flag){ System.err.println("司令:【士兵"+n+"个,任务完成!】"); } else { System.err.println("司令:【士兵"+n+"个,集合完毕!】"); flag = true; } } }

Demo - 测试

/**
 * 模块:【CyclicBarrier 循环栅栏】
 * 

* 开发: Bruce.Liu By 2018/9/3 下午8:43 Create */ public class CyclicBarrierDemo { public static void main(String[] args) { boolean flag = false; final int n = 10 ; Thread [] ts = new Thread[n]; CyclicBarrier cyclic = new CyclicBarrier(n,new BarrierRun(flag,n)); System.err.println("队伍集合!"); for(int i = 0 ; i < n; ++i){ System.err.println("士兵:"+i+"报道!"); ts[i] = new Thread(new Soldier(cyclic,"士兵:"+i)); ts[i].start(); } } }

执行结果

队伍集合!
士兵:0报道!
士兵:1报道!
士兵:2报道!
士兵:3报道!
士兵:4报道!
士兵:5报道!
士兵:6报道!
士兵:7报道!
士兵:8报道!
士兵:9报道!
司令:【士兵10个,集合完毕!】
士兵:4 - 任务执行完成!
士兵:0 - 任务执行完成!
士兵:9 - 任务执行完成!
士兵:1 - 任务执行完成!
士兵:8 - 任务执行完成!
士兵:3 - 任务执行完成!
士兵:2 - 任务执行完成!
士兵:7 - 任务执行完成!
士兵:6 - 任务执行完成!
士兵:5 - 任务执行完成!
司令:【士兵10个,任务完成!】

参考:《实战 Java 高并发程序设计》这本书。

你可能感兴趣的:(并发编程 - CyclicBarrier)