并发线程库中并发辅助类CyclicBarrier使用详解

原创 2012年03月25日 23:56:32

ClyClicBarrier是线程并发库中的一个并发辅助类,允许一组线程相互等待,直到所有的线程都到达屏障点才被CyclicBarrier释放唤醒。释放等待线程后的CyclicBarrir可以重用,因此我们将其称之为循环的barrier。

CyclicBarrier对象的创建:

1、new CyclicBarrier(int parties):

创建具有指定数量参与者(线程)的CyclicBarrier,当所有的参与者(线程)都处于等待状态时启动屏障,但不会在启动屏障的时候执行预定义的屏障操作。

2、new CyclicBarrier(int parties, Runnable run):

创建具有指定数量参与者(线程)的CyclicBarrier,当所有的参与者(线程)都处于等待状态时启动屏障,并在启动屏障的时候执行预定义的屏障操作,预定义屏障操作是由run参数指定的,由最后一个进入等待状态的参与者(线程)执行。

CyclicBarrier中的重要方法:

int await():

在所有的参与者(线程 )中都调用了barrier的await方法之前,导致调用barrier.await方法的当前线程一直等待;即要使参与者(线程)到达 屏障点,必须在参与者(线程)中调用barrier的await方法。该方法是个阻塞方法。

CyclicBarrier的执行过程:

1、在所有的参与者(线程)中调用barrier的await方法,使当前线程到达屏障点进入等待状态。

2、CyclicBarrier在所有指定数量的参与者都进入屏障点(调用barrier的await方法)之前一直处于等待状态,等待所有的参与者(线程)都到达屏障点。

3、当指定数量的参与者(线程)都调用了barrier.await方法到达屏障点后,barrier启动屏障;如果预定义了屏障操作,则由最后一个到达屏障点的参与者(线程)执行屏障操作,也就是执行run线程。

4、参与者(线程)自调用barrier的await方法起就一直处于等待状态,当屏障操作执行完毕后,barrier会释放等待线程(参与者),并唤醒参与者,参与者(线程)又可以做自己的事情,而barrier又回到初始状态,可以被重新使用。


下面使用CyclicBarrier模拟公司员工开会的场景:

1、员工进入会议室。

2、等所有的参会员工都到达会议室后才开始会议。

3、员工在会议期间发表讲话。

/**
 * 
 */
package com.huaxia.concurrent.cyclicbarrier;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author wangcz
 * CyclicBarrier测试入口类
 * 模拟场景:公司员工开会,等全部员工都到齐后才开始会议
 */
public class CyclicBarrierTestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**假定公司参加会议的人数为20*/
		CyclicBarrier cb = new CyclicBarrier(20, new BarrierThread());
		Random ran = new Random();
		ExecutorService es = Executors.newCachedThreadPool();
		for (int i = 1; i <= 20; i++) {
			es.submit(new EmployeeJoinMeeting(cb, ran.nextInt(900) + 100));
		}
		es.shutdown();
	}
}


/**
 * 
 */
package com.huaxia.concurrent.cyclicbarrier;

import java.util.concurrent.CyclicBarrier;

/**
 * @author wangcz
 * 前来参加会议的员工类
 */
public class EmployeeJoinMeeting implements Runnable {

	private CyclicBarrier cb;
	private long useTime;
	

	/**
	 * @param cb
	 * @param useTime
	 */
	public EmployeeJoinMeeting(CyclicBarrier cb, long useTime) {
		super();
		this.cb = cb;
		this.useTime = useTime;
	}


	/**
	 * 
	 */
	public EmployeeJoinMeeting() {
		super();
	}


	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			/**参会员工去会议室*/
			System.out.println("[" + Thread.currentThread().getName() + "] is walking to meet...");
			Thread.sleep(useTime);
			System.out.println("[" + Thread.currentThread().getName() + "] uses time " + useTime + "ms, now has reached meetingroom...");
			/**等待所有参会员工到齐*/
			cb.await();
			/**参会员工发表讲话*/
			System.out.println("[" + Thread.currentThread().getName() + "] has speaked in meetingroom...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

/**
 * 
 */
package com.huaxia.concurrent.cyclicbarrier;

/**
 * @author wnagcz
 * 屏障操作线程,当最后一个线程到达屏障点,该线程执行
 */
public class BarrierThread implements Runnable {

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		System.out.println("all employees has reached, now the meeting is going to begin...");
		try {
			Thread.sleep(5000);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


[笔记][Java7并发编程实战手册]3.5 在集合点的同步CyclicBarrier循环barrier

[笔记][Java7并发编程实战手册]系列目录CyclicBarrier详细原理解说,可先查看别人的博客:http://www.cnblogs.com/skywang12345/p/3533995.h...
  • mr_zhuqiang
  • mr_zhuqiang
  • 2015年08月22日 17:46
  • 825

【java并发】线程并发库的使用

1. 线程池的概念  在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念。假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排...
  • eson_15
  • eson_15
  • 2016年06月02日 21:15
  • 5772

Java并发工具类详解

Java并发工具类详解,包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger
  • sunxianghuang
  • sunxianghuang
  • 2016年08月22日 20:23
  • 2146

用栅栏(CyclicBarrier)实现高并发测试

public class TestCyclic { @Test public void test01() { int count = 10000;//并发线程数 ...
  • BDblog_chang
  • BDblog_chang
  • 2017年05月01日 22:56
  • 245

Java原生多线程并发方法归纳

Java原生多线程并发方法归纳: Object.wait: 该方法只能在持有锁的情况下调用,也就是在同步块中,如下所示,调用该方法后,当前线程会被放入obj对象的waiting 池中(注意,一个...
  • coollye
  • coollye
  • 2015年07月26日 20:21
  • 440

java并发之CyclicBarrier(障碍器)

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,...
  • gongpulin
  • gongpulin
  • 2016年04月24日 22:53
  • 1499

JDK并发包---(10)循环栅栏:CyclicBarrier

//CyclicBarrier反复线程计数:一个司令集结士兵,执行任务的例子 import java.util.Random; import java.util.concurrent.BrokenBa...
  • miqi770
  • miqi770
  • 2017年01月10日 15:21
  • 483

Java并发编程之——CyclicBarrier的使用

首先看一下官方关于CyclicBarrier的简介: /** * A synchronization aid that allows a set of threads to all wait for...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年06月09日 16:33
  • 1423

并发工具包之CountDownLatch|CyclicBarrier|Semaphore

在java的并发包中为我们提供了三种并发控制的手段,他们分别是CountDownLatch|CyclicBarrier|Semaphore,今天我们分别来讲解一下这三种方法以及使用场景 Coun...
  • lirongqian123
  • lirongqian123
  • 2018年01月31日 00:41
  • 13

Java 编程要点之并发(Concurrency)详解

本文详细介绍了 Java 并发(Concurrency)的基础用法和原理。
  • kkkloveyou
  • kkkloveyou
  • 2016年01月22日 13:20
  • 7421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:并发线程库中并发辅助类CyclicBarrier使用详解
举报原因:
原因补充:

(最多只允许输入30个字)