文档章节

CyclicBarrier的使用

summerpxy
 summerpxy
发布于 2014/01/03 12:52
字数 481
阅读 758
收藏 2

   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
45
0
闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

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

gaolu
2015/05/29
0
0
Java并发编程之CyclicBarrier源码分析

JUC 中 回环屏障 CyclicBarrier 的使用与分析,它也可以实现像 CountDownLatch 一样让一组线程全部到达一个状态后再全部同时执行,但是 CyclicBarrier 可以被复用。那么 CyclicBarrier 内部的...

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

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

阿拉德大陆的魔法师
2016/11/26
52
0
java.util.concurrent.CyclicBarrier组件说明

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

文星
2012/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的MemCheckpointStreamFactory

序 本文主要研究一下flink的MemCheckpointStreamFactory CheckpointStreamFactory flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStreamFactory.java /*......

go4it
9分钟前
0
0
注册全局组件

注册全局组件的好处是,可以直接在html中直接调用组件而不用每次都要在vue文件中注册组件,坏处也是很明显的,因为每个vue都默认加载了全局组件,所以全局组件如果非常庞大,会拖慢所有页面的...

Carbenson
14分钟前
0
0
二十分钟教你如何将区块链应用与函数计算相结合

前言 本篇文章适合对区块链应用感兴趣或是想要通过函数计算服务进一步开发区块链应用的新人。本文将结合阿里云区块链服务、阿里云函数计算服务、阿里云日志服务 以及社区应用 Marbles,手把手...

阿里云官方博客
17分钟前
1
0
Double数相加后结果不准确

在我们进行两个double运算时,例如:2..0-1.1 不是想象的输出0.9,而是0.89999999999999999。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十...

嘴角轻扬30
24分钟前
1
0
去除移动端点击效果

移动端点击时,会有一个类似active的短暂背景淡出效果,去除该效果可使用 -webkit-tap-highlight-color: rgba(255, 0, 0, 0);

originDu
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部