转:http://www.iteye.com/topic/980944
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
-
-
CyclicBarrier(int):
-
-
-
CyclicBarrier(int,Runnable):
-
-
- await():
//设置parties、count及barrierCommand属性。
CyclicBarrier(int):
//当await的数量到达了设定的数量后,首先执行该Runnable对象。
CyclicBarrier(int,Runnable):
//通知barrier已完成线程
await():
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
-
-
-
-
-
-
-
public class Total {
-
-
-
-
public static void main(String[] args) {
-
TotalService totalService = new TotalServiceImpl();
-
CyclicBarrier barrier = new CyclicBarrier(5,
-
new TotalTask(totalService));
-
-
-
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);
-
-
System.out.println(code + "省已经计算完成,并通知汇总Service!");
-
try {
-
- barrier.await();
-
} catch (InterruptedException e) {
- e.printStackTrace();
-
} catch (BrokenBarrierException e) {
- e.printStackTrace();
- }
- }
-
- }
/**
* 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。
*
* @author guangbo email:weigbo@163.com
*
*/
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!
=======================================
开始全国汇总
其它业务类
-
-
-
-
-
public interface BillService {
-
-
-
-
-
-
-
-
public void bill(String code);
-
- }
-
-
-
-
-
-
public interface TotalService {
-
-
-
-
-
public void count();
-
- }
/**
* @author guangbo
*
*/
public interface BillService {
/**
* 各省计费
*
* @param code
* 省编码
*/
public void bill(String code);
}
/**
* @author guangbo
*
*/
public interface TotalService {
/**
* 汇总各省数据
*/
public void count();
}
实例讲解,力求简单易懂,高效实用。欢迎拍砖,谢绝漫骂。
分享到:
相关推荐
本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...
# Java中的CyclicBarrier类最全讲义 ## 1. 简介 ### 1.1 并发编程与线程协作 在现代软件开发中,特别是高性能计算领域,利用多核处理器的能力变得至关重要。为了充分利用这些硬件资源,程序员们开始广泛采用并发...
本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 CountDownLatch的应用场景: CountDownLatch是一个非常有用的线程控制工具,它可以使一个线程等待其他线程达到某一目标后进行自己的下...
Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。...
Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...
本文将详细介绍这三个辅助类的用法和实例详解。 一、CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。它可以让一个线程等待其他线程执行完毕后再执行。...
Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...
本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。
本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`方法 尽管不推荐,但可以通过`Thread.sleep()`方法让主线程休眠一段时间来等待子线程。这种方法的问题在于,睡眠时间必须预估...
Java中将异步调用转换为同步调用有多种方法,本文将详细介绍五种方法:使用wait和notify方法、使用条件锁、使用Future、使用CountDownLatch、使用CyclicBarrier。 1. 使用wait和notify方法 wait和notify方法是...
在本文中,我们将介绍两种重要的并发工具辅助类:CountDownLatch和CyclicBarrier。 一、CountDownLatch CountDownLatch是一种同步工具,允许一个或多个线程等待其他线程完成操作。它主要通过countDown(计数器)和...
本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...
本文将介绍让线程按顺序执行的8种方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。 一、使用线程的join方法 join()是Thread的方法,作用是调用...
- 同步工具类如 `Semaphore`、`CyclicBarrier` 和 `CountDownLatch` 提供了更高级别的同步机制,使得开发人员能够更方便地管理多线程间的同步问题。 - 这些类可以用来解决常见的多线程编程问题,比如资源池管理和...
对于并发编程,Eckel解释了线程、同步以及并发工具类,如Semaphore、CyclicBarrier和ExecutorService,这些都是构建多线程应用的关键。他还介绍了Java的并发模型,包括volatile关键字、synchronized块和方法,以及...
- **并发工具类**:介绍CountDownLatch、CyclicBarrier等并发工具类的功能和使用场景。 ### 结论 通过对这些知识点的学习,初学者可以建立起扎实的Java基础知识体系,为进一步学习更高级的主题奠定坚实的基础。...
6. **并发工具类**:讲解Java提供的并发工具,如Semaphore、CountDownLatch、CyclicBarrier等。 7. **Java虚拟机(JVM)**:介绍JVM的工作原理,包括类加载、内存模型和垃圾回收机制。 8. **模块化系统(Jigsaw...