一个同步辅助类,它同意一组线程互相等待,直到到达某个公共屏障点 (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简单入门使用的更多相关文章

  1. Java中Redis简单入门

    Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...

  2. Java的多线程 简单入门

    Java的多线程 简单入门 首先能够先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序仅仅是一组指令的有序集合.它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次 ...

  3. Java中的简单工厂模式

    举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...

  4. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...

  5. java中CyclicBarrier的使用

    文章目录 CyclicBarrier的方法 CyclicBarrier的使用 java中CyclicBarrier的使用 CyclicBarrier是java 5中引入的线程安全的组件.它有一个bar ...

  6. java中最简单的计算执行时长的方式

    日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.u ...

  7. Java中怎么简单的使用正则表达式?

    对于正则表达式,我通常的认识就是通过一些陌生的奇怪的符号就可以完成很复杂事件的好帮手!实际上正则表达式确实是这方面的好助手,接下来让我们一起认识一下Java中怎么使用正则表达式吧. 初见Pattern ...

  8. java中的多线程入门

    进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 而多线程的好处就是效率高,充 ...

  9. Java反射的简单入门

    1.Class的简单介绍 Class类的类表示正在运行的Java应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...

随机推荐

  1. js-函数柯里化

    内容来自曾探,<JavaScript设计模式与开发实践>,P49 函数柯里化(function currying)又称部分求值.一个currying的函数首先会接受一些参数,接受了这些参数 ...

  2. js-jQuery性能优化(二)

    5.数组方式使用jQuery对象 使用jQuery选择器获取结果是一个jQuery对象.然而,jQuery类库会让你感觉正在使用一个定义了索引和长度的数组.在性能方面,建议使用简单的for或者whil ...

  3. windows与虚拟机的linux共享一个文件夹

    1.安装VMware Tools,在VMware面板上选择“虚拟机-重新安装VMware tools…” 2.使用命令 Ctrl+Alt+T 打开终端: 3.切换用户到root,命令 su 回车,输入 ...

  4. 本地用maven搭建SpringMvc+redis集成

    ---恢复内容开始--- 首先本地需要搭建私服,简单说一下搭建私服的步骤 1.为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而 ...

  5. redis学习历程

    redis只知道作用于缓存,其它一无所知,所以现在系统的 学习下,这样应用的时候可以考虑多面性和实用性 首先先了解一下redis的背景和概念 背景 Redis是一个开源的使用ANSI C语言编写.支持 ...

  6. java web dev知识积累

    tomcat体系结构 可以从tomcat的server.xml文件中元素的层次结构来理解tomcat的体系结构: Server(可以视为tomcat本身)->经由connector可以有多个(c ...

  7. Oracle EBS 新增 OAFM 个数

    在 $INST_TOP/ora/10.1.3/opmn/conf/opmn.xml中 找到 <process-type id="oafm" module-id="O ...

  8. 做为一个.net码农,打开公司的一个项目,大叔我哭了

    先说下背景,楼主在上海,之前一直是做BS互联网开发的,今年进入这家公司,是做软件产品的小外企. 然后,啥也不说了,直接上图吧: 因为一个屏幕没有办法显示出来,所以我截了3张图,然后拼成一张,这还是我花 ...

  9. java实现安全证书相关操作

    https://blog.csdn.net/zhushanzhi/article/details/77864516 版权声明:本文为博主原创文章,未经博主允许不得转载. package test; i ...

  10. 乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

    乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻 ...