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应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...
随机推荐
- 前端了解即可:postman(接口测试)的使用
postman的使用,前端了解即可.因为都是一些工具的应用,截图比较多,之前在有道云笔记上总结记录过,在这不在写了,展示一张笔记截图. 此文仅做参考一下,有不足之处,欢迎指正:
- springcloud 入门 1 (浅谈版本关系)
SpringCloud: 参考官网:https://projects.spring.io/spring-cloud/ 中文版 https://springclou ...
- SEO-搜索引擎优化
一.定义 SEO(Search Engine Optimization):汉译为搜索引擎优化.是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名.目的是:为网站提供生态式的自我营销解决方 ...
- 根据模板导出Excel报表并复制模板生成多个Sheet页
因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为 根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...
- 进程控制编程——Linux编程
1.进程的创建 编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动.让每个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b” 和“c”. ...
- 【require.js】模块化开发
一.Require.js及AMD Require.js:是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一. AMD(Asynchronous Module Definit ...
- 没有插件的sublime编辑器是没有灵魂的
这阵子各种捣鼓,现在趁有空记录一下sublime编辑器的一些实用的插件和安装方法,下午又该继续学习了. 接下来安装的是htmlHint.jsHint.cssLint以及汉化这几种插件,其实插件会使我们 ...
- 技术分享之AQS——内容提要
1. 背景 最近团队内部技术分享,我做了个关于AQS的分享.ppt中涵盖的部分要点内容,现在整理到博客上. 关于AQS本身的源码解读,可以参考我之前的博文. 2. 要点梳理 下面是一些技术分享的要点梳 ...
- Maven单独构建多模块项目中的单个模块
Maven单独构建多模块项目中的单个模块 说明: 1.可能存在的场景,多模块项目没有互相引用,那么此时可以单独构建单个项目,指定到子模块的pom.xml文件即可完成编译. 2.如果多模块项目各自都 ...
- mysql用户创建与授权
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...