并发线程库中并发辅助类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();
		}
	}
}


相关文章推荐

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

public class TestCyclic { @Test public void test01() { int count = 10000;//并发线程数 ...

Java并发编程-同步辅助类之CyclicBarrier

在上一篇文章中我们介绍了同步辅助类CountDownLatch,在Java Concurrent包下还有另一个同步辅助类CyclicBarrier与CountDownLatch非常类似,它也允许多个线...

java 并发编程实战第三章同步辅助类CyclicBarrier解析

java并发编程实战第三章 同步辅助类CyclicBarrier解析本实例演示了该类的一个主要用途:在集合点的同步。 4.在集合点的同步(这里的任务是分两个阶段完成的,而且这两个阶段是受到Cyc...

同步辅助类 CountDownLatch、CyclicBarrier作用

对于某种需求,比如 A,B,C 三个并发的线程全部处理完后才执行 D

两个重要的多线程辅助类之CyclicBarrier和CountDownLatch的用法

最近在做在线客服系统的并发测试,由于没有很专业的测试人员,所以手写了一个小程序来模拟并发。使用jetty-io模拟浏览器与服务端之间的websocket。现在想要的一个场景就是,看看系统在大并发下的情...

java多线程:12、CyclicBarrier同步辅助类

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

java多线程 栅栏(CyclicBarrier) 和 多线程辅助类 CountDownLatch

5.JAVA 多线程: 要求所有线程执行完成后,等待未执行完的 线程执行完后,才会向下进行 用: countDownLatch countDownLatch = new CountDownLatch(...

线程知识学习六——并发(辅助类)

继其几篇博客线程的并发知识的了解,我们使用了synchronized和lock,我们这篇博客说实现线程并发的一些辅助类。辅助类概览都有哪些辅助类呢?我们看下图 图中有五个辅助类,分别是:信号...

Java并发编程-同步辅助类之CountDownLatch

CountDownLatch是Java Concurrent包下提供的同步辅助类。在完成一组正在其他线程中执行的操作之前,它允许线程一直等待。和Semaphore类似,它使用一个整数进行初始化,Sem...

线程知识学习七——并发(辅助类)

继其几篇博客线程的并发知识的了解,我们使用了CountDownLatch和CyclicBarrier两个辅助类,这篇博客说实现线程并发其他辅助类。SemaphoreSemaphore:信号量,就是资源...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:并发线程库中并发辅助类CyclicBarrier使用详解
举报原因:
原因补充:

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