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();
}
}
}
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();
}
}
}
相关文章推荐
- Java高并发程序-Chapter3 JDK并发包(第九讲)同步控制之 ReentrantLock 重用锁
- Java高并发程序-Chapter3 JDK并发包(第十七讲)同步控制之ReentrantLock 的实现
- Java高并发程序-Chapter3 JDK并发包(第十八讲)同步控制之自定义SafeQueue
- Java高并发程序-Chapter3 JDK并发包(第十讲)同步控制之 Condition
- Java高并发程序-Chapter3 JDK并发包(第十一讲)同步控制之 Semaphore
- Java高并发程序-Chapter3 JDK并发包(第十二讲)同步控制之 ReadWriteLock
- Java高并发程序-Chapter3 JDK并发包(第十三讲)同步控制之 CoutDownLatch
- Java高并发程序-Chapter3 JDK并发包(第十四讲)同步控制之自己动手实现 CoutDownLatch
- Java高并发程序-Chapter3 JDK并发包(第十六讲)同步控制之LockSupport
- JDK并发包---(10)循环栅栏:CyclicBarrier
- 同步机制之--java CyclicBarrier 循环栅栏
- Java并发工具类(二):同步屏障CyclicBarrier
- java高并发程序设计总结五:jdk并发包其他同步控制工具类:ReadWriteLock/CountDownLatch/CyclicBarrier/LockSupport
- Java并发编程之2——同步工具类的使用(CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore)
- JAVA线程同步辅助类CyclicBarrier循环屏障
- Java同步工具类——栅栏[CyclicBarrier]
- Java高并发程序设计笔记5之JDK同步控制
- java并发之同步工具类三之栅栏Barrier
- Java并发同步工具类之CyclicBarrier
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)