CyclicBarrier分析与实例

一,介绍



?CyclicBarrier是一个保持多个线程共享同一个状态的工具类。也就是说在多线程环境下,可以通过设定某一个状态来达到线程之间的同步。这个类有两个有参构造方法,分别是CyclicBarrier(int n)和CyclicBarrier(int n, Runnable r)。第一个构造方法的意思是指给这个类设置等待点到多少时才执行在run方法中调用await方法之后的操作;第二个构造器的Runnable可以看作一个等待点的狼烟,狼烟是什么,是一种信号,也就是说,在等待线程达到n这个数量之后,会开始执行run方法中调用await方法之后的代码,而在调用这些代码前,会先放狼烟,然后再执行那些代码。

这个类在多线程统计数据时还是很有用的。但是要注意,如果你的线程数量总是达不到设置的n的数量,那么这时,操作将被阻塞,即await方法后面的代码总是不能执行。

二,例子

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrrierTest {
    static int count = 0;

    static List<Integer> data= Collections.synchronizedList(new ArrayList<Integer>());
    public static void main(String[] args) {
        //设置2个等待线程,存在两个等待线程时,计算集合中的何,然后再清除集合中的数据
        CyclicBarrier cb = new CyclicBarrier(2, new Runnable() {
            public void run() {
                int sum = 0;
                for(int i = 0; i < data.size(); i++) {
                    sum += data.get(i);
                }
                System.out.println("current sum is " + sum);
                data.clear();
            }
        });
        int n = 10;
        for(int i =0 ; i< n; i++) {
            new Thread(new CBThread(2, cb,data)).start();  //开启n个线程
        }
    }

}

class CBThread implements Runnable{
    private int n;
    private CyclicBarrier cb;
    private List<Integer> data;
    public CBThread(int n,CyclicBarrier cb,List<Integer> data) {
        this.n = n;
        this.cb = cb;
        this.data = data;
    }

    public void run() {
        Random random = new Random();
//        while(!done()) {
            int n = random.nextInt(10);
            data.add(n);
            System.out.println(Thread.currentThread().getName() + " ======" + n + ",  " + cb.getNumberWaiting());
            try {
                cb.await();  //await方法后面的代码总是在cb.getNumberWait等于n的时候才执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("走起......" + CyclicBarrrierTest.count);
//        }
    }

    private boolean done() {
        return false;
    }
}

CyclicBarrier分析与实例,布布扣,bubuko.com

时间: 2024-10-21 11:59:05

CyclicBarrier分析与实例的相关文章

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

rip路由协议 细节分析及实例配置【完整版】

rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现自己不足的问题,也希望能够找到一些比较冷僻的问题,这样子才会有意思多了.   先上图,这个就是我准备做实验的基本用图了.现在已经按照图上标注的IP将所有基本配置设置好了. 在这个实验中,大多数都是基于ripv1,只有在需要比较的时候才会把版本改成ripv2,然后判断完之后再切换为ripv1: 第一步

HDFS API的java代码分析与实例

HDFS API的java代码分析与实例 1.HDFS常用的方法,我已经写好,我们看一下 // Create()方法,直接在HDFS中写入一个新的文件,path为写入路径,text为写入的文本内容 public static void  Create(String path,String text) throws IOException {             Configuration conf=new Configuration();                  conf.set(

日志聚合与关联分析技术实例视频演示

日志聚合与关联分析技术实例视频演示 各种网络应用日志如何预处理变成事件,各类事件又是如何经过聚合进行关联分析的技术已在<开源安全运维平台OSSIM最佳实践>一书进行了详尽的分析,下面就给大家展示,在大数据IDS机房环境中如何在海量日志中,快速定位SSH暴力破解攻击源,让你看得见网络攻击. 高清视频地址: http://www.tudou.com/programs/view/uP0V9fQlzuo 看过之后,感觉如何?ELK.Splunk系统能实现吗?这里我只是举了SSH的例子,可类似这种可视化

MD中bitmap源代码分析--状态机实例

1. page_attrs的状态转换关系 之前说过,bitmap的优化核心是:bitmap设置后批量写入:bitmap延时清除.写bit用bitmap_statrwrite() + bitmap_unplug()两个函数,实现了bitmap设置后的批量写入:清bit用bitmap_endwrite()+两轮bitmap_deamon_work()实现了bitmap延迟清除.   2. 一个实例分析 下面以一个写请求实例来进行分析.假设写之前的chunk的数据都是一致的,还是以写3*4096*8(

Linux下安装部署AWStats日志分析系统实例

AWStats是使用Perl语言开发的一款开放性日志分析系统,可分析Apache网站服务器的访问日志,还可以用来分析Samba.Vsftpd.IIS等日志信息.       此文章主要讲解如何在linux系统下安装部署关于对Apache网站服务站日志分析的AWStats. 实验步骤一,安装部署AWStats分析软件. 一,安装AWStats软件包. 直接将其解压到/usr/local/awstats目录下即可完成安装. 使用命令:mkdir -p /usr/local/awstats tar z

Linux环境下安装部署AWStats日志分析系统实例

AWStats是使用Perl语言开发的一款开放性日志分析系统,可分析Apache网站服务器的访问日志,还可以用来分析Samba.Vsftpd.IIS等日志信息.       此文章主要讲解如何在linux系统下安装部署关于对Apache网站服务站日志分析的AWStats. 实验步骤一,安装部署AWStats分析软件. 一,安装AWStats软件包. 直接将其解压到/usr/local/awstats目录下即可完成安装. 使用命令:mkdir -p /usr/local/awstats tar z

ELK日志分析系统(实例!!!)

ELK日志分析系统概述 ELK是Elasticsearch.Logstash.Kibana的简称 Elasticsearch是实时全文搜索和分析引擎 Logstash是一个用来搜集.分析.过滤日志的工具 Kibana是一个基于Web的图形界面,用于搜索.分析和可视化存储在 Elasticsearch指标中的日志数据 日志服务器 提高安全性 集中存放日志 缺陷:对日志的分析困难 ELK日志分析系统 收集数据:LogstashAgent 建立索引:ElasticSearchCluster 数据可视化

Shiro处理简单的身份验证的分析及实例

在两天在看Shiro,开涛兄的教程还是写的比较易读,差不多看了一天吧,就准备拿来用了. 可能是想的太简单了,在用的时候确实碰到一些问题,就拿最简单的身份验证来说吧: 需要说明的是,这里是集成在Spring中使用,身份验证我直接使用了Shiro提供的 org.apache.shiro.web.filter.authc.FormAuthenticationFilter 如果url应用了该拦截器,那么处理流程是大致这样的: 由于之前用markdown花的流程图显示不下,所以还是改成图片形式了. 比如我