`
chenzehe
  • 浏览: 532396 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

同步工具类之CyclicBarrier循环的barrier

阅读更多

     CyclicBarrier在java.util.concurrent包下,是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

构造方法

public CyclicBarrier(int parties)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。 
参数:parties - 在启动 barrier 前必须调用 await() 的线程数 
抛出:IllegalArgumentException - 如果 parties 小于 1

public CyclicBarrier(int parties,
                     Runnable barrierAction)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
参数:parties - 在启动 barrier 前必须调用 await() 的线程数
barrierAction - 在启动 barrier 时执行的命令;如果不执行任何操作,则该参数为 null 
抛出:IllegalArgumentException - 如果 parties 小于 1

方法摘要

 int await() 
          在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 
 int await(long timeout, TimeUnit unit) 
          在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 
 int getNumberWaiting() 
          返回当前在屏障处等待的参与者数目。 
 int getParties() 
          返回要求启动此 barrier 的参与者数目。 
 boolean isBroken() 
          查询此屏障是否处于损坏状态。 
 void reset() 
          将屏障重置为其初始状态。 

 

如下代码演示赛跑,等到barrier上所有线程都调用await方法后才往下执行:

/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import java.io.IOException;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2013-1-11 下午03:04:06
 */

public class CyclicBarrierTest {
	
	public static void main(String[] args) throws IOException, InterruptedException {
		CyclicBarrier barrier = new CyclicBarrier(3);
		new Thread(new Runner(barrier, "1号选手")).start();
		new Thread(new Runner(barrier, "2号选手")).start();
		new Thread(new Runner(barrier, "3号选手")).start();
	}
}

class Runner implements Runnable {
	private CyclicBarrier	barrier;
	
	private String			name;
	
	public Runner(CyclicBarrier barrier, String name) {
		super();
		this.barrier = barrier;
		this.name = name;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep(3000);
			System.out.println(name + " 准备好了...");
			// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
			barrier.await();
			System.out.println(name + " 起跑!");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
		
	}
}

1号选手 准备好了...
3号选手 准备好了...
2号选手 准备好了...
1号选手 起跑!
3号选手 起跑!
2号选手 起跑! 

 

 

分享到:
评论

相关推荐

    JAVA CyclicBarrier类详解.docx

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

    Java中的CyclicBarrier类最全讲义

    目录: 简介 1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法...循环使用CyclicBarrier 4.1 场景介绍 4.2 使用CyclicBarrier循环使用 CyclicBarrier与CountDownLatch的对比 最佳实践与注意事项

    CyclicBarrier用法.docx

    CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...

    CyclicBarrier的使用以及注意事项

    CyclicBarrier的使用以及注意事项

    Java并发系列之CyclicBarrier源码分析

    主要为大家详细分析了Java并发系列之CyclicBarrier源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java并发实例之CyclicBarrier的使用

    主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。

    Java多线程开发之CyclicBarrier

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

    CountDownLatch和CyclicBarrier用法实例大全

    《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法

    Java多线程之并发工具类

     主要参考资料:java并发编程的艺术、Java并发——同步工具类  二、CountDownLatch(同步倒数计数器)–不仅仅用于多线程  1.作用:允许一个或多个线程等待其他线程完成操作。  CountDownLatch的构造函数...

    java并发之并发工具类

    java并发之并发工具类,并发工具类有很多,这里主要介绍了CyclicBarrier、CountDownLatch、Semaphore、Exchanger

    CyclicBarrier,reentrantlock,condition模拟抢票

    用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620

    java多线程之CyclicBarrier的使用方法

    主要介绍了java多线程之CyclicBarrier的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    CyclicBarrier的用法

    NULL 博文链接:https://hubowei1.iteye.com/blog/2312471

    Java并发包讲解

    java并发包讲解 可以找我要代码,qq 3341386488 ## 线程安全-并发容器JUC--...## Concurrent同步工具类 countDownLatch CyclicBarrier Semaphore Exchanger ReenTrantLock ReentrantReadWriteLock 等等

    java线程并发cyclicbarrier类使用示例

    CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。

    Java中CyclicBarrier的用法分析

    CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

Global site tag (gtag.js) - Google Analytics