java CyclicBarrier的使用

api对CyclicBarrier的描述: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。  也就是说他可以使一组线程先等待 然后达到某个条件之后再一起执行,有点map/reduce的感觉。

举个例子: 目前有个int,  分配3个任务线程对他加1 , 最后主任务线程汇集计算结果,代码如下:

    private static AtomicInteger i = new AtomicInteger(0);
    public static void main(String[] args){
        CyclicBarrier cb = new CyclicBarrier(3,new Runnable() {
            //主任务汇集计算结果
            public void run() {
                System.out.println("结果为" + i.get());
            }
        });
        ExecutorService es = Executors.newFixedThreadPool(5);
        es.submit(new SubTask(cb, "线程一"));
        es.submit(new SubTask(cb, "线程二"));
        es.submit(new SubTask(cb, "线程三"));
        es.shutdown();
    }

    //子任务计算
    private static class SubTask implements Runnable{
        private CyclicBarrier cb;
        private String msg;
        public SubTask(CyclicBarrier cb, String msg){
            this.cb = cb;
            this.msg = msg;
        }
        public void run() {
            try {
                System.out.println(msg + " enter");
                i.incrementAndGet();
                Thread.sleep(1000l);
                cb.await();
                System.out.println(msg + " quit");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

结果:

线程一 enter
线程三 enter
线程二 enter
结果为3

线程三 quit
线程二 quit
线程一 quit

时间: 2024-10-11 17:17:57

java CyclicBarrier的使用的相关文章

java CyclicBarrier的介绍和使用

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用.因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier. 举例说明:银行要进行账目录入,以防一个录入出现录入错误,采用两人对同一账目同时录入,以达到校对的效果 伪代码如下: import java.util.concurrent.BrokenBarrier

java CyclicBarrier同步屏障

CyclicBarrier的字面意思是可循环使用的屏障,它的主要作用是,让一组线程到达一个屏障时被阻塞,知道最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行. 1.简介: CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其中参数标识屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞. package com.test; import java.util.concur

Java CyclicBarrier

概述 1.CyclicBarrier介绍 2.CyclicBarrier源码分析 3.CyclicBarrier示例 CyclicBarrier介绍 CyclicBarrier翻译过来也叫栅栏,意思很明显,就是一组线程相互等待,均到达栅栏的时候,再运行.CyclicBarrier是可以重复使用的,而之前的CountDownLatch是一次性的.CyclicBarrier允许一组线程相互等待,直到到达某个公共屏障点,屏障点即一组任务执行完毕的时候. 与CountDownLatch的区别: 1.Cy

Java CyclicBarrier 浅谈

CyclicBarrier 意思是栅栏, 可以让多组线程到达某个点后开始等待, 等指定的线程数量都到达后再恢复线程, 这个CyclicBarrier是可以循环使用的. 又称为循环栅栏. 栗子: public class BarrierDemo { public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(5); final CyclicBarrier barrie

Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)CyclicBarrier示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3533995.html CyclicBarrier简介 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier p

java路障CyclicBarrier

当所有线程都执行到某行代码,才可已往下执行: package threadLock; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; pub

深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier[转]

如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用.它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).所谓屏障点就是一组任务执行完毕的时刻. 清单1 一个使用CyclicBarrier的例子 package xylz.study.concurrency.lock; import java.util.concurrent.BrokenBarrierException;import java.util.concur

Java学习笔记--并发工具Semaphore,CountDownLatch,CyclicBarrier,Exchanger

Semaphore 实现典型的信号量 CountDownLatch 在指定数量的事件发生前一直等待 CyclicBarrier 使一组线程在一个预定义的执行点等待 Exchanger 交换两个线程的数据 1. Semaphore 信号量(Semaphore),是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源 在java中,还可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请求的有可能

java中CyclicBarrier简单入门使用

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