Java并发之CyclicBarria的使用

一.简介

  笔者在写CountDownLatch这个类的时候,看到了博客园上的《浅析Java中CountDownLatch用法》这篇博文,为博主扎实的技术功底所折服,对Java多线程方面的只是信手拈来,首先在此感谢博主给了我灵感,让我进一步了解了CountDownLatch的用法,在此请收下小弟的膝盖(如果博主能够看到的化)。借着《浅析Java中CountDownLatch用法》这篇博文,笔者想借着这个例子说一下 CyclicBarria的用法。CyclicBarria中文翻译过来就是"循环栅栏"。

二. CyclicBarria的使用

  读者如果读到该文章,请先观看一下 《浅析Java中CountDownLatch用法》这篇文章,笔者只是借助于该博文作者,稍稍作了写修改,用CyclicBarria来实现。代码如下:

public class CyclicBarriaTest2 {

    private static final int PLAYER_AMOUNT = 5;  //五个运动员

    private static ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);

    static class Command implements Runnable {

        private boolean flag;

        public Command(boolean flag){
this.flag = flag;
} @Override
public void run() {
if(flag){
System.out.println("比赛开始...");
flag = false;
}else{
System.out.println("比赛结束...");
exe.shutdown();
}
}
} public static void main(String[] args) {
/**
* 循环栅栏。当cb调用 await()方法的时候,当5个线程全部就绪,就执行 Command实例化的线程,
* 当所有线程,执行完毕,后又碰到await()方法,就等5个线程全部执行完毕, 然后再执行Command的实例
* 线程。
*/
CyclicBarrier cb = new CyclicBarrier(5, new Command(true)); Player[] plays = new Player[PLAYER_AMOUNT]; for(int i = 0; i < PLAYER_AMOUNT; i++) {
plays[i] = new Player(i+1, cb);
} for(Player p:plays) {
exe.execute(p); //分配线程
}
}
}

Player类的实现如下:

class Player implements Runnable{

    private int num;
private CyclicBarrier cb; public Player(int num, CyclicBarrier cb){
this.num = num;
this.cb = cb;
} @Override
public void run() {
try {
cb.await(); //等待所有线程就绪,执行cb中的线程。 Thread.sleep((long)(Math.random() * 100)); //随机分配时间,即运动员完成时间
System.out.println("Play" + num + " arrived."); cb.await(); //当所有线程执行完毕,再去执行cb中的线程
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}

Java并发之CyclicBarria的使用的更多相关文章

  1. Java并发之CyclicBarria的使用(二)

    Java并发之CyclicBarria的使用(二) 一.简介 之前借助于其他大神写过一篇关于CyclicBarria用法的博文,但是内心总是感觉丝丝的愧疚,因为笔者喜欢原创,而不喜欢去转载一些其他的文 ...

  2. java并发之固定对象与实例

    java并发之固定对象与实例 Immutable Objects An object is considered immutable if its state cannot change after ...

  3. Java并发之BlockingQueue的使用

    Java并发之BlockingQueue的使用 一.简介 前段时间看到有些朋友在网上发了一道面试题,题目的大意就是:有两个线程A,B,  A线程每200ms就生成一个[0,100]之间的随机数, B线 ...

  4. 深入理解Java并发之synchronized实现原理

    深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...

  5. Java并发之Semaphore的使用

    Java并发之Semaphore的使用 一.简介 今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽.现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类 ...

  6. Java并发之CountDownLatch的使用

    Java并发之CountDownLatch的使用 一. 简介 Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障.笔者今晚在家闲来无事,翻 ...

  7. java并发之hashmap源码

    在上篇博客中分析了hashmap的用法,详情查看java并发之hashmap 本篇博客重点分析下hashmap的源码(基于JDK1.8) 一.成员变量 HashMap有以下主要的成员变量 /** * ...

  8. Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段.它可以修饰静态类方法,实例方法,或代码块.修饰static静态方法时是对整个类加锁. 一.实现原理 在JVM中对象内存分三块区域,对象头.实例数据.对齐 ...

  9. JAVA并发之阻塞队列浅析

    背景 因为在工作中经常会用到阻塞队列,有的时候还要根据业务场景获取重写阻塞队列中的方法,所以学习一下阻塞队列的实现原理还是很有必要的.(PS:不深入了解的话,很容易使用出错,造成没有技术深度的样子) ...

随机推荐

  1. bootstrap随笔点击增加

          ht5:   <div class="form-group"><label class="col-sm-2 control-label&qu ...

  2. ListView setOnItemClickListener无效原因具体分析

    前言 近期在做项目的过程中,在使用listview的时候遇到了设置item监听事件的时候在没有回调onItemClick 方法的问题. 我的情况是在item中有一个Buttonbutton. 所以不会 ...

  3. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  4. 第二只Python爬虫

    同样参照网上教程,同时把会的不多的html标签又复习了一下 同时安利一个网站,我唯一加入过的一个社团官网(web开发协会 www.nutjs.com 前任会长是属于大牛级的存在,目前网站已多次重构,花 ...

  5. 【BZOJ3714】[PA2014]Kuglarz 最小生成树

    [BZOJ3714][PA2014]Kuglarz Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获 ...

  6. java如何计算两个经纬度之间的距离?

    /*计算两个经纬度之间的距离 结果单位:米 */public static double getDistance(String lat1Str, String lng1Str, String lat2 ...

  7. 【IDEA】单元测试:项目中引入JUnit测试框架+Mock简单了解

    一.Junit 使用和说明: 参考:单元测试第三弹--使用JUnit进行单元测试-HollisChuang's Blog http://www.hollischuang.com/archives/17 ...

  8. sql---字段类型转换,sql获取当前时间

    一.字段类型转换 convert(要转换成的数据类型,字段名称)例如 convert(varchar(100),col_name)Convert(int,Order_no) 二.sql获取当前时间 s ...

  9. HTTP 筛选器 DLL C:\Windows\Microsoft.Net\Framework\v4.0.30319\aspnet_filter.dll 加载失败。数据是错误。

    今天在一台win2003的云主机上,安装.net 4.0时,所有的网站都打不开了.打开事件查看器,发现以下错误: HTTP 筛选器 DLL C:\Windows\Microsoft.Net\Frame ...

  10. PC京东登录页分析 curl

    w 正确的组合,没有显示新页面的数据. <!doctype html> <html> <head> </head> <?php include(' ...