24.循环栅栏 CyclicBarrier
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的更多相关文章
- 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier
1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...
- Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier
昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- 循环栅栏:CyclicBarrier(司令要求任务) 读书笔记
可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public Cycli ...
- 3.1.6 循环栅栏:CyclicBarrier
package 第三章.循环栅栏CyclicBarrier; import java.util.concurrent.BrokenBarrierException;import java.util.c ...
- 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法
CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...
- java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏
简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ...
- 线程工具类 - CyclicBarrier(循环栅栏)
CyclicBarrier官方文档 一.原理 CyclicBarrier是另外一种多线程并发控制实用工具.它和CountDownLatch非常类似,它也可以实现线程的计数等待,但它的功能比CountD ...
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
随机推荐
- STN空间变换网络
STN的主要思想是通过网络学习一个变化参数,然后计算出新图在原图上对应的坐标,再通过某种填充方法填充新图. 使得得到的新图很好的适应nn训练.可以理解为是拿来把不规范的图像变换为标准形式的图像. 网络 ...
- CentOS7.2安装Oracle12.1.0.2
Centos7.2环境安装(安装桌面) #安装界面 #查看版本 cat /etc/redhat-release #查看连接 ifconfig eth0 echo "127.0.0.1 tes ...
- NET Core SDK 已安装在VS2017不可见
本地装了6个版本的net core sdk,但是在vs2017,vs2019 只是显示1.0和1.1: 重装,重启了好几遍也没用,没想到是环境变量PATH顺序问题,将x64的放在x86前,就OK了~:
- 分布式消息中间件及RabbitMQ
分布式应用和集群: 从部署形态来看,它们都是多台机器或者多个进程部署,而且都是为了实现一个业务功能. 如果是一个业务被拆分成多个子业务部署在不同的服务器上,那就是分布式应用 如果是同一个业务部署在多台 ...
- spring-cloud:利用eureka实现服务提供与调用示例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCl ...
- UVA 12012 Detection of Extraterrestrial(KMP求循环节)
题目描述 E.T. Inc. employs Maryanna as alien signal researcher. To identify possible alien signals and b ...
- 安装uWebSocketIO
https://github.com/uNetworking/uWebSockets sudo apt-get install libuv1-dev git clone https://github. ...
- CSS基础知识复习
1. CSS优先级 标签内部属性 style定义的CSS > 文档内定义的css > 引用外部CSS文件 2. CSS选择器类型 . 标签选择器 . 类选择器(使用.做标识) . ID选择 ...
- [CSP-S模拟测试]:tree(DP)
题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...
- CSS深入理解float
初衷:图片环绕效果 1.会使父元素高度塌陷 2.包裹性 3.让元素block化 4.去空格化 5.清除浮动 .clearfix::after{ content:""; disp ...