`
Luob.
  • 浏览: 1590044 次
  • 来自: 上海
社区版块
存档分类
最新评论

java CyclicBarrier 循环障碍阻塞

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


//设置parties、count及barrierCommand属性。   
CyclicBarrier(int):   
  
//当await的数量到达了设定的数量后,首先执行该Runnable对象。   
CyclicBarrier(int,Runnable):   
  
//通知barrier已完成线程   
await(): 



应用场景 
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。 

实例分析 
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码: 

/**  
 * 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。  
 *      
 */  
public class Total {   
  
    // private ConcurrentHashMap result = new ConcurrentHashMap();   
  
    public static void main(String[] args) {   
        TotalService totalService = new TotalServiceImpl();   
        CyclicBarrier barrier = new CyclicBarrier(5,   
                new TotalTask(totalService));   
  
        // 实际系统是查出所有省编码code的列表,然后循环,每个code生成一个线程。   
        new BillTask(new BillServiceImpl(), barrier, "北京").start();   
        new BillTask(new BillServiceImpl(), barrier, "上海").start();   
        new BillTask(new BillServiceImpl(), barrier, "广西").start();   
        new BillTask(new BillServiceImpl(), barrier, "四川").start();   
        new BillTask(new BillServiceImpl(), barrier, "黑龙江").start();   
  
    }   
}   
  
/**  
 * 主任务:汇总任务  
 */  
class TotalTask implements Runnable {   
    private TotalService totalService;   
  
    TotalTask(TotalService totalService) {   
        this.totalService = totalService;   
    }   
  
    public void run() {   
        // 读取内存中各省的数据汇总,过程略。   
        totalService.count();   
        System.out.println("=======================================");   
        System.out.println("开始全国汇总");   
    }   
}   
  
/**  
 * 子任务:计费任务  
 */  
class BillTask extends Thread {   
    // 计费服务   
    private BillService billService;   
    private CyclicBarrier barrier;   
    // 代码,按省代码分类,各省数据库独立。   
    private String code;   
  
    BillTask(BillService billService, CyclicBarrier barrier, String code) {   
        this.billService = billService;   
        this.barrier = barrier;   
        this.code = code;   
    }   
  
    public void run() {   
        System.out.println("开始计算--" + code + "省--数据!");   
        billService.bill(code);   
        // 把bill方法结果存入内存,如ConcurrentHashMap,vector等,代码略   
        System.out.println(code + "省已经计算完成,并通知汇总Service!");   
        try {   
            // 通知barrier已经完成   
            barrier.await();   
        } catch (InterruptedException e) {   
            e.printStackTrace();   
        } catch (BrokenBarrierException e) {   
            e.printStackTrace();   
        }   
    }   
  
} 



结果: 
开始计算--北京省--数据! 
开始计算--上海省--数据! 
北京省已经计算完成,并通知汇总Service! 
开始计算--四川省--数据! 
四川省已经计算完成,并通知汇总Service! 
上海省已经计算完成,并通知汇总Service! 
开始计算--广西省--数据! 
广西省已经计算完成,并通知汇总Service! 
开始计算--黑龙江省--数据! 
黑龙江省已经计算完成,并通知汇总Service!
分享到:
评论

相关推荐

    JAVA CyclicBarrier类详解.docx

    CyclicBarrier的名字由“Cyclic”(循环)和“Barrier”(屏障)组成,意味着这个屏障在等待的线程全部到达后可以重置,以便于下一轮的同步。它的一个核心特性就是支持一个可选的Runnable任务,当所有线程都到达屏障...

    Java并发实例之CyclicBarrier的使用

    2. 线程调用await()方法:每个线程调用await()方法告诉CyclicBarrier已经到达屏障,当前线程被阻塞。 3. 最后一个线程到达屏障:当最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。 ...

    Java中的CyclicBarrier类最全讲义

    # Java中的CyclicBarrier类最全讲义 ## 1. 简介 ### 1.1 并发编程与线程协作 在现代软件开发中,特别是高性能计算领域,利用多核处理器的能力变得至关重要。为了充分利用这些硬件资源,程序员们开始广泛采用并发...

    java多线程之CyclicBarrier的使用方法

    Java多线程之CyclicBarrier的使用方法 Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待...

    java并发编程专题(九)----(JUC)浅析CyclicBarrier

    Java 并发编程专题(九)----(JUC)浅析 CyclicBarrier CyclicBarrier 是 Java 并发编程中的一个同步辅助工具,它允许一组线程全部等待彼此到达公共屏障点。它的字面意思是可循环使用的屏障,用于让一组线程到达一...

    java.CyclicBarrier(处理方案示例).md

    java.CyclicBarrier(处理方案示例).md

    CyclicBarrier的用法

    在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...

    Java中CyclicBarrier的用法分析

    Java中的`CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点。这个屏障点就像一个交通信号灯,只有当所有的车辆(线程)都到达了交叉口,信号灯才会变为绿灯,允许它们...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    CountDownLatch和CyclicBarrier用法实例大全

    CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达屏障点后,一起继续执行。与CountDownLatch不同,CyclicBarrier可以重置,因此可以多次使用。 1. **初始化**: 通过`CyclicBarrier(int ...

    Java并发系列之CyclicBarrier源码分析

    Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    而CyclicBarrier更适用于循环或迭代的场景,例如多个线程协同完成一个任务的多个阶段,每个阶段结束后,线程会在barrier点会合,确认所有线程都到达后再一起进入下一阶段。 总结来说,CountDownLatch和...

    java 同步阻塞并唤醒指定线程

    这时,我们可以利用`java.util.concurrent`包中的`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)或`CountDownLatch`(计数门锁)等工具来更精细地控制线程的同步和唤醒。例如,`Semaphore`可以限制同时访问...

    Java并发编程(CyclicBarrier)实例详解

    CyclicBarrier是Java并发编程中的一种同步工具,用于让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier的应用场景是当需要多个线程之间...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    CyclicBarrier的使用以及注意事项

    CyclicBarrier的使用以及注意事项

    CyclicBarrier用法.docx

    CyclicBarrier是Java并发编程中一个非常重要的工具类,它属于java.util.concurrent包,主要用于多线程间的协作,尤其在需要多个线程等待彼此完成特定任务后才能继续执行的场景中发挥着关键作用。CyclicBarrier的名字...

Global site tag (gtag.js) - Google Analytics