java中CyclicBarrier简单入门使用
一个同步辅助类,它同意一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。此时 CyclicBarrier 非常实用。由于该 barrier 在释放等待线程后能够重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable 命令。在一组线程中的最后一个线程到达之后(但在释放全部线程之前)。该命令仅仅在每一个屏障点执行一次。若在继续全部參与线程之前更新共享状态,此屏障操作 非常实用。 在java JDK中是这样解释的。在我们日常开发中经常须要一组线程结束之后,再接着进行,我们就须要考虑使用这个类了。
运行之后打印例如以下结果:
线程 pool-1-thread-1即将到达线程集合点1,已有 1 到达继续等候
线程 pool-1-thread-3即将到达线程集合点1,已有 2 到达继续等候
线程 pool-1-thread-2即将到达线程集合点1,已有 3 到达都到齐,走吧
线程 pool-1-thread-2即将到达线程集合点2,已有 1 到达继续等候
线程 pool-1-thread-1即将到达线程集合点2,已有 2 到达继续等候
线程 pool-1-thread-3即将到达线程集合点2,已有 3 到达都到齐,走吧
线程 pool-1-thread-3即将到达线程集合点3。已有 1 到达继续等候
线程 pool-1-thread-1即将到达线程集合点3,已有 2 到达继续等候
线程 pool-1-thread-2即将到达线程集合点3,已有 3 到达都到齐,走吧
<pre name="code" class="java">import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CyclicBarrierTest { /**
* @param args
*/
public static void main(String[] args) {
ExecutorService ThreadPool = Executors.newCachedThreadPool();
final CyclicBarrier cyclic = new CyclicBarrier(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() { @Override
public void run() {
try {
Thread.sleep((long) (Math.random()*3000));
System.out.println("线程 " + Thread.currentThread().getName() + "即将到达线程集合点1,已有 " + (cyclic.getNumberWaiting()+1) + " 到达" + (cyclic.getNumberWaiting()==2 ? "都到齐,走吧": "继续等候"));
cyclic.await();
Thread.sleep((long) (Math.random()*3000));
System.out.println("线程 " + Thread.currentThread().getName() + "即将到达线程集合点2,已有 " + (cyclic.getNumberWaiting()+1) + " 到达" + (cyclic.getNumberWaiting()==2 ? "都到齐。走吧": "继续等候"));
cyclic.await();
Thread.sleep((long) (Math.random()*3000));
System.out.println("线程 " + Thread.currentThread().getName() + "即将到达线程集合点3,已有 " + (cyclic.getNumberWaiting()+1) + " 到达" + (cyclic.getNumberWaiting()==2 ? "都到齐,走吧": "继续等候"));
cyclic.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
};
ThreadPool.execute(runnable);
} } }
java中CyclicBarrier简单入门使用的更多相关文章
- Java中Redis简单入门
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...
- Java的多线程 简单入门
Java的多线程 简单入门 首先能够先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序仅仅是一组指令的有序集合.它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次 ...
- Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
- Java中的简单工厂模式(转)
Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...
- java中CyclicBarrier的使用
文章目录 CyclicBarrier的方法 CyclicBarrier的使用 java中CyclicBarrier的使用 CyclicBarrier是java 5中引入的线程安全的组件.它有一个bar ...
- java中最简单的计算执行时长的方式
日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.u ...
- Java中怎么简单的使用正则表达式?
对于正则表达式,我通常的认识就是通过一些陌生的奇怪的符号就可以完成很复杂事件的好帮手!实际上正则表达式确实是这方面的好助手,接下来让我们一起认识一下Java中怎么使用正则表达式吧. 初见Pattern ...
- java中的多线程入门
进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 而多线程的好处就是效率高,充 ...
- Java反射的简单入门
1.Class的简单介绍 Class类的类表示正在运行的Java应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...
随机推荐
- cf280C. Game on Tree(期望线性性)
题意 题目链接 Sol 开始想的dp,发现根本不能转移(貌似只能做链) 根据期望的线性性,其中\(ans = \sum_{1 * f(x)}\) \(f(x)\)表示删除\(x\)节点的概率,显然\( ...
- 【代码笔记】iOS-只让textField使用键盘通知
代码: #import "ViewController.h" @interface ViewController () @end @implementation ViewContr ...
- 学习ES6的全部特性
ES6 简介 ECMAScript 6 简称 ES6,是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了.它的目标是使得 JavaScript 语言可以用来编写复杂的大型应用程 ...
- NodeJS配置TaoBao源
npm install -g cnpm --registry=https://registry.npm.taobao.org
- css字体更小 css比12px更小的方法
<span style="margin-top: 0;-webkit-transform-origin-x: 0;-webkit-transform: scale(0.90);&quo ...
- 构建第一个SpringBoot工程
学习和使用 SpringBoot 有一段时间了,现在开始陆陆续续会总结归纳 SpringBoot 学习中遇到的相关知识点. SpringBoot 设计目的是用来简化新Spring应用的初始搭建以及开发 ...
- python 中* 和**的作用
先举个 ** 使用的例子: data = {"a": 1, "b": 2} def foo(**kwargs): print kwargs foo(a=1, b ...
- 解释JS变量作用域的范例
JS的变量作用域只有两种:全局作用域与函数作用域. 用var声明的变量不能简单的说是属于函数作用域,应该是说属于其最近的作用域. var a = 10; function test(){ var a; ...
- 数据结构入门之链表(C语言实现)
这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添 ...
- c#中(&&,||)与(&,|)的区别和应用
对于(&&,||),运算的对象是逻辑值,也就是True/False &&相当与中文的并且,||相当于中文的或者 .(叫做逻辑运算符又叫短路运算符) 运算结果只有下列四种 ...