并发编程 - CyclicBarrier

2018-09-03  本文已影响0人  52HzBoo

CyclicBarrier 循环栅栏

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

Soldier - 士兵

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

/**
 * 模块:【CyclicBarrier - 士兵】
 * <p>
 * 开发: 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 - 司令】
 * <p>
 * 开发: 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 循环栅栏】
 * <p>
 * 开发: 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 高并发程序设计》这本书。

上一篇下一篇

猜你喜欢

热点阅读