CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别
CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动。
当调用await时 指定的任务运行完后会awiat 直到最后一个线程运行完毕,才继续执行下一步动作
用法和countDownLatch差不多 countDownLatch只触发一次,而CyclicBarrier可以多次重用
public class CyclicBarrierSimple {
public static void main(String[] args) {
int N = 4;
/**
* partie:在达到删栏时 指定的线程数被阻塞等待...
* barrierAction:到达删栏时 执行的线程任务
*/
CyclicBarrier barrier = new CyclicBarrier(N,new ThreadRunner());
for (int i = 0; i < N; i++) {
new Writer(barrier).start();
}
try {
Thread.sleep(25000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("CyclicBarrier重用");
for(int i=0;i<N;i++) {
new Writer(barrier).start();
}
}
static class ThreadRunner implements Runnable{
@Override
public void run() {
System.out.println("大家统一到达删栏后执行...");
}
}
static class Writer extends Thread {
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier barrier) {
cyclicBarrier = barrier;
}
@Override
public void run() {
System.out.println(System.currentTimeMillis() + "线程" + Thread.currentThread().getName() + " 正在写入数据...");
try {
//以睡眠来模拟写入数据库操作
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "写入数据完毕,等待其他线程写入完毕");
int index = cyclicBarrier.await();
System.out.println("越过栅栏后的索引" + index);
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "所有线程写入完毕,继续处理其他任务");
}
}
}
1553691604894线程Thread-1 正在写入数据...
1553691604894线程Thread-3 正在写入数据...
1553691604894线程Thread-2 正在写入数据...
1553691604894线程Thread-0 正在写入数据...
线程Thread-1写入数据完毕,等待其他线程写入完毕
线程Thread-0写入数据完毕,等待其他线程写入完毕
线程Thread-2写入数据完毕,等待其他线程写入完毕
线程Thread-3写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引1
越过栅栏后的索引3
Thread-1所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-0所有线程写入完毕,继续处理其他任务
Thread-2所有线程写入完毕,继续处理其他任务
Thread-3所有线程写入完毕,继续处理其他任务
CyclicBarrier重用
1553691629896线程Thread-4 正在写入数据...
1553691629896线程Thread-5 正在写入数据...
1553691629896线程Thread-6 正在写入数据...
1553691629896线程Thread-7 正在写入数据...
线程Thread-5写入数据完毕,等待其他线程写入完毕
线程Thread-6写入数据完毕,等待其他线程写入完毕
线程Thread-4写入数据完毕,等待其他线程写入完毕
线程Thread-7写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引3
Thread-5所有线程写入完毕,继续处理其他任务
越过栅栏后的索引1
Thread-4所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-6所有线程写入完毕,继续处理其他任务
Thread-7所有线程写入完毕,继续处理其他任务
CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别的更多相关文章
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- canvas arcTo()用法详解 – CodePlayer
canvas arcTo()用法详解 – CodePlayer canvas arcTo()用法详解
- Java并发编程1--synchronized关键字用法详解
1.synchronized的作用 首先synchronized可以修饰方法或代码块,可以保证同一时刻只有一个线程可以执行这个方法或代码块,从而达到同步的效果,同时可以保证共享变量的内存可见性 2.s ...
- netstat用法详解
netstat用法详解 知识,netstat用法详解 图片 netstat用法详解 内容,netstat用法详介绍,netstat用法详正文 netstat命令是一个监控TCP/IP网络的非常有用的工 ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
随机推荐
- 排序--MergeSort 归并排序?
MergeSort 's implementation MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题 假设你有2个已经排好序的数组 数组[ 4 ][ 8 ] 和 数组 ...
- PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...
- python序列化与反序列化(json、pickle)-(五)
1.什么是序列化&反序列化? 序列化:将字典.列表.类的实例对象等内容转换成一个字符串的过程. 反序列化:将一个字符串转换成字典.列表.类的实例对象等内容的过程 PS:Python中常见的数据 ...
- BUUOJ 杂项MISC(1)
爱因斯坦 下载之后解压打开是一张爱因斯坦的图片,看来是图片隐写题 使用binwalk -e misc2.jpg 获得一个有flag.txt的压缩包,但是需要密码才能打开,猜想密码在图片里面,把图片丢进 ...
- Gradle上传依赖到私服(nexus)
子模块配置 buildscript { repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/cont ...
- Proxy:简单小巧又强大好用的代理系统
之前的文章介绍了许多我们在用的DevOps相关的工具系统,例如:方便创建多套运行环境的Alodi,对运维友好的配置中心Kerrigan,强大的自定义任务引擎Probius以及专注于数据库自动化的ove ...
- 深入理解.NET/WPF内存泄漏
众所周知,内存管理和如何避免内存泄漏(memory leak)一直是软件开发的难题.不要说C.C++等非托管(unmanaged)语言,即使是Java..NET等托管(managed)语言,尽管有着完 ...
- AcWing 334. K匿名序列
大型补档计划 题目链接 就是把序列分成无数段,每段长度 $ >= K$,然后 \([l, r]\) 这段的花费是 \(S[r] - S[l - 1] - (r - l + 1) * a[l]\) ...
- AcWing 294. 计算重复
暴力 其实这题的暴力就是个模拟.暴力扫一遍 \(conn(s_1, n_1)\),若出现了 \(res\) 个 \(s_2\). 答案就是 \(\lfloor res / n1 \rfloor\). ...
- Android开源项目-转载
一.视频播放 https://github.com/lipangit/JieCaoVideoPlayer 二.图片选择 https://github.com/pengjianbo/GalleryFin ...