博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发之CyclicBarria的使用
阅读量:5013 次
发布时间:2019-06-12

本文共 2139 字,大约阅读时间需要 7 分钟。

Java并发之CyclicBarria的使用

一.简介

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

二. CyclicBarria的使用

  读者如果读到该文章,请先观看一下 《》这篇文章,笔者只是借助于该博文作者,稍稍作了写修改,用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();        }    }}

 

转载于:https://www.cnblogs.com/miller-zou/p/6954215.html

你可能感兴趣的文章
努力打拼
查看>>
Unity3D项目开发一点经验
查看>>
C#--判断当前是否是移动设备和设备的型号
查看>>
ie8此加载项无法恢复&网站还原错误问题解决=lr成功打开ie成功录制脚
查看>>
异常过滤程序 EXCEPTION_EXECUTE_HANDLER, EXCEPTION_CONTINUE_EXECUTION,EXCEPTION_CONTINUE_SEARCH...
查看>>
不再有神的概念,将所有存在称之为文明,这很有意思
查看>>
3d旋转爱心
查看>>
GDB调试汇编堆栈过程分析
查看>>
C避免同一个文件被多次包含
查看>>
Linux系统中软件安装方式以及特点
查看>>
sublime text 3在windows中配置ctags插件,实现追踪函数或方法
查看>>
音视频处理之编码原理20170905
查看>>
ORACLE学习第二天
查看>>
第四周作业
查看>>
SQL SERVER 查询死锁
查看>>
mysql分页原理和高效率的mysql分页查询语句
查看>>
linux字典生成工具crunch
查看>>
Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
查看>>
Atitit gui界面ui技术发展史与未来趋势
查看>>
mysql 存储过程详解 存储过程
查看>>