import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; /**
* CyclicBarrier可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 
*/
public class CyclicBarrierDemo extends Thread {
private CyclicBarrier cyclicBarrier;
public CyclicBarrierDemo(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
} @Override
public void run() {
System.out.println("子线程,"+Thread.currentThread().getName()+ " 开始写...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程,"+Thread.currentThread().getName()+ " 写完成...");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("所有线程执行完毕...");
}
public static void main(String[] args){
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 0; i < 5; i++) {
CyclicBarrierDemo writer = new CyclicBarrierDemo(cyclicBarrier);
writer.start();
}
}
//子线程,Thread-0 开始写...
//子线程,Thread-1 开始写...
//子线程,Thread-2 开始写...
//子线程,Thread-3 开始写...
//子线程,Thread-4 开始写...
//子线程,Thread-1 写完成...
//子线程,Thread-0 写完成...
//子线程,Thread-2 写完成...
//子线程,Thread-4 写完成...
//子线程,Thread-3 写完成...
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
}

/**
* Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行
*/
public class CyclicBarrierDemo extends Thread {
private CyclicBarrier cyclicBarrier;
public CyclicBarrierDemo(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
} @Override
public void run() {
System.out.println("子线程,"+Thread.currentThread().getName()+ " 开始写...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程,"+Thread.currentThread().getName()+ " 写完成...");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("所有线程执行完毕...");
}
public static void main(String[] args){
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("完成一个小目标");
}
});
for (int i = 0; i < 5; i++) {
CyclicBarrierDemo writer = new CyclicBarrierDemo(cyclicBarrier);
writer.start();
}
}
//子线程,Thread-0 开始写...
//子线程,Thread-1 开始写...
//子线程,Thread-2 开始写...
//子线程,Thread-3 开始写...
//子线程,Thread-4 开始写...
//子线程,Thread-0 写完成...
//子线程,Thread-2 写完成...
//子线程,Thread-3 写完成...
//子线程,Thread-4 写完成...
//子线程,Thread-1 写完成...
//完成一个小目标
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
//所有线程执行完毕...
}
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; /**
* CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
* 循环栅栏 CyclicBarrier
* 可以反复使用的计数器
* 如:计数器设置为10,凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程
*
* public CyclicBarrier(int parties, Runnable barrierAction) //计数总数,线程总数
*/
public class CyclicBarrierDemo {
public static class Soldier implements Runnable{
private String soldier;
private final CyclicBarrier cyclicBarrier;
Soldier(String soldierName, CyclicBarrier cyclicBarrier) {
this.soldier = soldierName;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
//等待任务安排
System.out.println("开始了");
cyclicBarrier.await();
doWork();
//等待任务完成
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
//InterruptedException线程被中断
//BrokenBarrierException:表示当前的cyclicBarrier已经破损了,避免其他线程进行永久的,无所谓的等待
e.printStackTrace();
}
} void doWork() {
try {
Thread.sleep(Math.abs(new Random().nextInt()%10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(soldier+":任务完成");
}
}
public static class BarrierRun implements Runnable{
boolean flag;
int N; public BarrierRun(boolean flag, int n) {
this.flag = flag;
N = n;
} @Override
public void run() {
if (flag){
System.out.println(N+"个任务已完成!");
}else {
System.out.println("安排"+N+"个任务!");
flag = true;
}
}
}
public static void main(String[] args){
final int N = 10;
Thread[] allSoldier = new Thread[10];
boolean flag = false;
CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag, N));
System.out.println("安排任务...");
for (int i = 0; i < N; i++) {
System.out.println("任务"+i+"安排");
allSoldier[i] = new Thread(new Soldier("任务"+i,cyclic));
allSoldier[i].start();
}
}
//每运行完N个次数的任务就会执行BarrierRun任务 //安排任务...
//任务0安排
//任务1安排
//开始了
//开始了
//任务2安排
//开始了
//任务3安排
//开始了
//任务4安排
//任务5安排
//开始了
//任务6安排
//开始了
//任务7安排
//开始了
//任务8安排
//开始了
//开始了
//任务9安排
//开始了
//安排10个任务!
//任务6:任务完成
//任务3:任务完成
//任务9:任务完成
//任务5:任务完成
//任务4:任务完成
//任务0:任务完成
//任务8:任务完成
//任务7:任务完成
//任务2:任务完成
//任务1:任务完成
//10个任务已完成!
}

24.循环栅栏 CyclicBarrier的更多相关文章

  1. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  2. Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier

    昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...

  3. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  4. 循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

    可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public Cycli ...

  5. 3.1.6 循环栅栏:CyclicBarrier

    package 第三章.循环栅栏CyclicBarrier; import java.util.concurrent.BrokenBarrierException;import java.util.c ...

  6. 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法

    CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...

  7. java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏

    简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ...

  8. 线程工具类 - CyclicBarrier(循环栅栏)

    CyclicBarrier官方文档 一.原理 CyclicBarrier是另外一种多线程并发控制实用工具.它和CountDownLatch非常类似,它也可以实现线程的计数等待,但它的功能比CountD ...

  9. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

随机推荐

  1. Linux的cat命令详解

    The cat command reads one or more files and copies them to standard output 也就是说,cat命令读取文件,并显示在 stand ...

  2. Ubuntu 16.04配置vncviewer

    网上有各种各样的教程,既混乱又复杂.这是提供一个亲自测试可用的配置方案,十分简单,桌面环境选用xfce,Ubuntu版本是16.04. 1 安装 Xfce 和 TightVNC sudo apt in ...

  3. 【leetcode】1023. Binary String With Substrings Representing 1 To N

    题目如下: Given a binary string S (a string consisting only of '0' and '1's) and a positive integer N, r ...

  4. CentOS6.5下安装jdk配置环境变量错误问题:

    CentOS6.5下安装jdk,使用gedit /etc/profile  配置环境变量为如下: export JAVA_HOME=/usr/soft/jdk7export PATH=$JAVA_HO ...

  5. iOS 常用代码之 UICollectionView

    记一下 不用每次都从0开始写,人生苦短 ,省点时间给自己 之前必须完成相关注册: . cell . 头部和尾部 [self.hotAndHistoryCollectionV registerNib:[ ...

  6. Java Web学习总结(10)学习总结-EL表达式

    一,EL 表达式概述(EL主要从域中取数据) EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 二,EL从域中 ...

  7. 2017 山东一轮集训 Day2 Shadow (三维凸包点在面上投影)

    在三维坐标中,给定一个点光源,一个凸多面体,以及一个平面作为地面. 求该凸多面体在地面上阴影的面积. 这三个点共同确定了一个平面,这个平面就是地面.保证这三个点坐标互异且不共线.前三行每行三个实数,每 ...

  8. Word图片粘贴上传控件,直接粘贴图片到编辑器-DEDE

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  9. 使用SSH 工具 Xshell 6连接CentOS 7.4

    在使用Xshell 6连接 服务CentOS 7.4之前,首先你要配置好服务器,如果没有配置好服务器的,请访问: (一)小白教小白配置 服务器 好了,开始正文! 首先准备,SSH 工具 Xshell ...

  10. [CSP-S模拟测试]:platform(后缀数组+二分+线段树)

    题目传送门 题目描述 走过奈何桥有一个名叫望乡台的土台,望乡台有个名曰孟婆的老妇人在卖孟婆汤.一生爱恨情仇,一世浮沉得失,都可以随这碗孟婆汤遗忘得干干净净.现在有$n$碗孟婆汤摆成一排,汤的品种不超过 ...