1.概述

java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count),

各线程通过调用barrier.await()进入等待,并且计数+1, 第count个线程调用await(),满足条件,

唤醒所有之前调用await等待的线程(类似于公司班车, A上车A等着,B上车B等着, ...最后一个Z上车了, 班车发车)

2. 示例

package com.rocky.test.CyclicBarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){
public void run(){
System.out.println("inside barrier.................."+ Thread.currentThread().getName());
}
});
for(int i=0; i<10; i++)
new Thread(new Worker(barrier)).start();
}
} class Worker implements Runnable{ private CyclicBarrier barrier;
Worker(CyclicBarrier barrier){
this.barrier = barrier;
}
@Override
public void run() { System.out.println(Thread.currentThread().getName()+" ready go... ");
try {
barrier.await();
System.out.println(Thread.currentThread().getName()+" done");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}

控制台

..........
Thread-8 ready go...
Thread-9 ready go... //最后一个执行await()的线程,会执行构造CyclicBarrier时Runnable中的任务(run()方法)
inside barrier..................Thread-9
Thread-9 done
Thread-0 done
..............

3. 说明        和CountDownLatch比较

3.1 之所以叫CyclicBarrier(cyclic循环之意), 因为构造时设置的count可以循环运用

一圈await结束之后, 线程继续调用await进入下一轮等待直到第count个线程await时一起唤醒。

3.2 await()方法带有返回值,表示当前是第几个到达barrier的线程

3.3 BrokenBarrierException异常  当某个等待的线程发生中断,会抛出该异常,其他等待的线程也会收到该异常,并返回。

..........
if (g.broken)
throw new BrokenBarrierException();

java.util.concurrent.CyclicBarrier 使用的更多相关文章

  1. 谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏

    这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. ...

  2. Java 并发工具包 java.util.concurrent 用户指南

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  3. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  4. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  5. java.util.concurrent 多线程框架

    http://daoger.iteye.com/blog/142485 JDK5中的一个亮点就是将Doug Lea的并发库引入到Java标准库中.Doug Lea确实是一个牛人,能教书,能出书,能编码 ...

  6. [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    转载自http://janeky.iteye.com/blog/769965     Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...

  7. Java_并发工具包 java.util.concurrent 用户指南(转)

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...

  8. java多线程学习--java.util.concurrent (转载)

    题记:util和concurrent 包是后续重点先看的和学习的模块 原文地址:http://www.cnblogs.com/sunhan/p/3817806.html CountDownLatch, ...

  9. java多线程学习--java.util.concurrent

    CountDownLatch,api 文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.h ...

随机推荐

  1. 【算法】C++用链表实现一个箱子排序附源代码详解

    01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...

  2. 如何高度自定义CollectionView的header和foot

    最近在研究CollectionView,突然发现觉得他的HeaderSection和FootSection也可以高度自定义. 国外有详细的教程:http://www.appcoda.com/ios-c ...

  3. tableView header Refresh 下拉刷新/上拉加载

    一. UIScrollView 的分类 //作为入口 #import <UIKit/UIKit.h> #import "RefreshHeader.h" #import ...

  4. expect分发脚本

    [分发系统]yum -y install expect #!/usr/bin/expect set host "192.168.11.102" " spawn ssh r ...

  5. 大数据平台-java、mysql安装

    补充: 对于ssh登录不是特定端口22的,进行文件修改 vim /etc/ssh/sshd_config Port 61333 简化后序命令输入,修改文件如下:  一.java环境安装 一共5台服务器 ...

  6. 世界最大BT服务器本周死了三回 海盗湾要凉凉?

    想當初,我是受到BT網站海盜灣的啟發,開發了一個DHT下載網站:http://www.ibmid.com,有一段時間通宵編程,理解此個協議. 海盗湾(The Pirate Bay)是世界上最大的 BT ...

  7. 更改Android编译软件版本(make/gcc/bision)

    一.make版本 1.下载make的压缩包 ftp://ftp.gnu.org/gnu/make/ 2.解压,安装 cd make-x.x ./configuration sh build.sh su ...

  8. [转] 公共DNS,114.114.114.114和8.8.8.8

    [From] https://zhidao.baidu.com/question/304558434158495364.html 一.两者的联系 114.114.114.114和8.8.8.8,这两个 ...

  9. C回调函数

    转自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 在面试的时候被问到什么是回调函数,我是属于会用但不懂概念的那类 ...

  10. 基于python实现Oracle数据库连接查询操作

    使用python语言连接Oracle数据库配置 #coding:utf-8 import cx_Oracle as oracle db=oracle.connect('root/123456@192. ...