您的位置:首页 > 编程语言 > Java开发

Java高并发程序-Chapter3 JDK并发包(第十五讲)同步控制之CyclicBarrier 循环栅栏

2018-03-28 08:16 537 查看
1. 概述
Cyclic意为循环,也就是说这个计数器可以反复使用。

比如,假设我们将计数器设置为10。那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程

2. 主要接口
public CyclicBarrier(int parties, Runnable barrierAction)

barrierAction就是当计数器一次计数完成后,系统会执行的动作

await
3. 示意图



4. 程序实例package com.john.learn.high.concurent.ch03.tools;

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

public class CyclicBarrierDemo {

public static class Soldier implements Runnable {

private String soldierName;
private CyclicBarrier cyclicBarrier;

public Soldier(CyclicBarrier cyclicBarrier, String soldierName) {
this.cyclicBarrier = cyclicBarrier;
this.soldierName = soldierName;
}

public void run() {

try {

doPrepare();

// 等待所有士兵到齐
cyclicBarrier.await();

doWork();

// 任务完成
cyclicBarrier.await();

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

e.printStackTrace();

} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void doPrepare() {

try {

Thread.sleep(new Random().nextInt(5) * 1000);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();
}

System.out.println(this.soldierName + "士兵已到达!");
}

private void doWork() {

try {

Thread.sleep(new Random().nextInt(10) * 1000);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();
}

System.out.println(this.soldierName + " Task Completed");

}

}

public static class BarrierAction implements Runnable {

private int soldierCount;

private boolean flag;

public BarrierAction(int soldierCount) {

this.soldierCount = soldierCount;
}

public void run() {

if (flag == false) {

System.out.println(soldierCount + "个士兵,集合完毕!");

flag = true;

return;
}

System.out.println(soldierCount + "个士兵 ,任务完毕!");

}

}

public static void main(String[] args) {

int soldierCount = 10;

CyclicBarrier cyclicBarrier = new CyclicBarrier(soldierCount, new BarrierAction(soldierCount));

for (int i = 0; i < soldierCount; i++) {

Thread thread = new Thread(new Soldier(cyclicBarrier, String.valueOf(i)));
thread.start();

}

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并行编程
相关文章推荐