文档章节

CyclicBarrier的使用

summerpxy
 summerpxy
发布于 2014/01/03 12:52
字数 481
阅读 749
收藏 2
点赞 0
评论 0

   CyclicBarrier称为障栅,这个类有什么作用呢?这个类是用来同步线程用的。以小黑车为例(就是盘踞在地铁口的黑出租),一般小黑车是坐4个人,只有4个人都满了之后小黑车才会走,那么如果你是第一个来的,进车坐下,等第二个人来。第二个人来了,等第三个人,如此直到所有的4个人满了之后小黑车才开车。那么这个类也是一样的。

第一个线程:运行到障栅出,等待第二个线程到达。

第二个线程:运行到障栅出,等待第三个线程到达。

第三个线程:运行到障栅出,等待第四个线程到达。

第四个线程:运行到障栅出,障栅解除,所有线程都开始执行。


下面是一个demo,arr[0]和arr[1]的赋值是两个线程完成的,当两个线程的赋值结束之后才会得到arr[2]的值:

package com.wx.app;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

	static int n = 3;

	static int[] arr = new int[3];

	//2代表了barrier处需要拦截两个线程
	static CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {

		@Override
		public void run() {

			arr[2]=arr[0]+arr[1];
			
			for(int i=0;i<arr.length;i++)
			{
				System.out.println("arr["+i+"]="+arr[i]);
			}
		}

	});

	public static void main(String[] args) {

		new Thread(new Component(1,arr,barrier)).start();
		new Thread(new Component(0,arr,barrier)).start();
	}

	public static class Component implements Runnable {

		int id;
		
		int[] arr;
		
		CyclicBarrier barrier;

		public Component(int id,int[] arr,CyclicBarrier barrier)
		{
			this.id=id;
			this.arr=arr;
			this.barrier=barrier;
		}

		@Override
		public void run() {

			arr[id]=new Random().nextInt(100);
			
			try {
			     
				System.out.println(id+"开始休息");
				//运行到barrier处,睡着等待。。。。
				barrier.await();
				//barrier打开,运行线程
				System.out.println(id+"醒来了");
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				
				e.printStackTrace();
			}
		}

	}
}

CyclicBarrier的执行顺序:当少于期望数量的线程到达barrier.await()方法时,线程停止。当达到期望的数量的时候,执行CyclicBarrier中的runnable方法,cyclic解除,其他的线程接着开始执行。

© 著作权归作者所有

共有 人打赏支持
summerpxy
粉丝 56
博文 34
码字总数 14266
作品 0
浦东
程序员
CyclicBarrier让多线程齐步走

从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文首先会介绍CyclicBarrier辅助工具类,其次将用CyclicBarrier工具类来完成一个实例,最后将给出CyclicBarri...

王孟君 ⋅ 2016/11/06 ⋅ 0

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数。 2.CountDownLatch是一次性的,CyclicBarrier可以重用。 3.CountDow...

gaolu ⋅ 2015/05/29 ⋅ 0

java.util.concurrent.CyclicBarrier组件说明

一、CyclicBarrier 1、功能说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等...

文星 ⋅ 2012/09/25 ⋅ 0

Java并发编程中级篇(四):使用CyclicBarrier实现并发线程在集合点同步

上一节讲到了CountDownLatch这个并发辅助类,它能够让一个线程等待其他并发线程执行完一组任务后再继续执行,也可以说是实现了并发线程在集合点同步。但是Java又给出了一个更强大的并发辅助类...

阿拉德大陆的魔法师 ⋅ 2016/11/26 ⋅ 0

Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore

(原来写过一篇相同标题的文章,不过因为 OSChina 编辑器的缘故,格式改乱了,所以重写一篇。原文已删除,收藏原文的朋友对不住。) 这次说一下 JUC 中的同步器三个主要的成员:、 和 (不知...

编走编想 ⋅ 2014/03/13 ⋅ 14

Java并发编程:JUC锁-09CyclicBarrier

CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么Cycli...

潘威威的博客 ⋅ 2017/12/18 ⋅ 0

[Java并发系列] 5.Java并发工具类

在J.U.C包中,提供了几个非常有用的并发工具类,通过使用这些工具类,可以有效提高并发编程中,并发流程的控制,以提升效率和代码质量,如下: CountDownLatch CyclicBarrier Semaphore 1. ...

Xiangdong_She ⋅ 2017/10/27 ⋅ 0

CountDownLatch和CyclicBarrier的区别

在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用。那如果只是这么简单的话,我觉得CyclicBar...

ksfzhaohui ⋅ 2013/08/27 ⋅ 0

CountDownLatch和CyclicBarrier的区别

在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用。那如果只是这么简单的话,我觉得CyclicBar...

智不别扬 ⋅ 2013/01/23 ⋅ 0

【死磕Java并发】-----J.U.C之并发工具类:CyclicBarrier

此篇博客所有源码均来自JDK 1.8 CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程...

chenssy ⋅ 2017/04/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 23分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 25分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 26分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 29分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 32分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 32分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 33分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 39分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 44分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 45分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部