- 浏览: 16886 次
- 性别:
- 来自: 杭州
最新评论
转自:http://www.iteye.com/topic/980944
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
Java代码
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
Java代码
//设置parties、count及barrierCommand属性。 CyclicBarrier(int): //当await的数量到达了设定的数量后,首先执行该Runnable对象。 CyclicBarrier(int,Runnable): //通知barrier已完成线程 await():
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
Java代码 /** * 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。 * * @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! ======================================= 开始全国汇总 其它业务类 Java代码 /** * @author guangbo * */ public interface BillService { /** * 各省计费 * * @param code * 省编码 */ public void bill(String code); } /** * @author guangbo * */ public interface TotalService { /** * 汇总各省数据 */ public void count(); }
发表评论
-
开发工具备忘
2014-06-19 23:41 3851.谷歌公司的:guava; 2.apache公司的:Co ... -
java.util.date
2014-06-17 21:58 392<div class="iteye-blo ... -
(转) spring 的jar各包作用
2014-06-01 15:03 467转自:http://blog.csdn.net/c ... -
(转)Hibernate 的jar各包作用
2014-06-01 15:02 356转自:http://blog.csdn.net/cailian ... -
(转)Callable,Runnable比较及用法
2014-05-27 13:53 536转自:http://murielily.blog. ... -
(转)java Future 接口介绍
2014-05-27 13:52 483转自:http://blog.csdn.net/yangyan ... -
9_(JAVA基础300集最全教程 学习)自动装箱和拆箱
2014-05-16 00:08 604在JDK5.0中新增了自动装箱和拆箱,为开发人员解决了很多 ... -
8_(JAVA基础300集最全教程 学习)Collectioin各容器实现方式
2014-05-15 23:01 3801.ArrayList : 实现方式(非可序化Object数组 ... -
(转)java关键字Transient
2014-05-15 22:52 425转自:http://horst.sun.blog.163.co ... -
(转)Java使用JDBC连接Oracle_MSSQL实例
2014-05-14 23:20 492转自:http://blog.csdn.net/tungkee ... -
ant入门
2014-05-14 23:07 512这几天忙着看项目中的 ... -
(备忘)java.lang.Class类
2014-05-10 21:48 416转自:http://lavasoft.blog.51cto.c ... -
(备忘)native2ascii转码工具使用
2014-05-10 21:49 404native2ascii简介:native2ascii是sun ... -
(转)java.lang.Object类
2014-05-10 21:49 1674转自:http://lavasoft.blog.51cto.c ... -
(备忘录)xml文件的生成和解析_JDOM_4
2014-05-09 14:45 453import java.io.FileNotFou ... -
(备忘录)xml文件的生成和解析_DOM4J_3
2014-05-09 13:58 361import java.io.File; import ... -
(备忘录)xml文件的生成和解析_SAX_2
2014-05-09 11:51 462一边加载一边解析,速度快,内存占用小,但是如果再次使用时需要再 ... -
(转)J2EE十三个规范
2014-05-09 09:48 407转自:http://www.ibm.com/developer ... -
(备忘录)xml文件的生成和解析_DOM_1
2014-05-09 09:25 736xml的解析一般分为两种方式,一种是SAX事件流的方式,另外一 ... -
7_(JAVA基础300集最全教程 学习)方法重载overload
2014-05-08 22:23 464方法重载指的是同样一个方法的多种实现方式,例如我有个加法计算方 ...
相关推荐
Java中将异步调用转换为同步调用有多种方法,本文将详细介绍五种方法:使用wait和notify方法、使用条件锁、使用Future、使用CountDownLatch、使用CyclicBarrier。 1. 使用wait和notify方法 wait和notify方法是...
10. **并发编程**:讲解了Java的并发工具,如Semaphore、CyclicBarrier、ExecutorService,以及并发集合如ConcurrentHashMap。 11. **Java反射API**:解释了如何在运行时动态访问和操作类、接口、对象,以及方法和...
- Java并发工具类:如`java.util.concurrent`包下的`ExecutorService`, `Semaphore`, `CyclicBarrier`, `CountDownLatch`等,它们为并发编程提供了丰富的解决方案。 - 死锁、活锁和饥饿:并发编程中的三个常见问题...
2. **并发编程**:讲解并发工具类,如Semaphore、CountDownLatch、CyclicBarrier和ExecutorService。 3. **文件系统与NIO**:介绍Java NIO(New IO)框架,包括通道、缓冲区和选择器的使用。 4. **网络编程**:...
4. **多线程**:讲述了如何在Java中创建和管理线程,包括同步机制(synchronized关键字、wait()、notify()和notifyAll()方法)、线程安全的容器以及并发工具类,如Semaphore、CyclicBarrier和CountDownLatch。...
12. **并发工具类**:介绍`java.util.concurrent`包中的并发工具,如`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`和`CyclicBarrier`等,以及并发容器如`ConcurrentHashMap`。 通过深入学习这些高级...
此外,书中还会涵盖其他并发工具类,如Semaphore、CyclicBarrier等。 7. **并发异常处理**:在并发编程中,正确处理异常是非常重要的,书中会讲解如何在多线程环境中优雅地处理异常。 8. **JVM内存模型与并发**:...
本章讨论了Vector、Hashtable等同步容器的局限性,并引出了并发工具类,如Semaphore、CyclicBarrier、CountDownLatch等,它们为多线程协作提供了便利。 第七章:线程局部变量 线程局部变量(ThreadLocal)在本章中...
对于并发编程,文档详细讨论了java.util.concurrent包下的各种并发工具类和接口,如LockSupport、AbstractQueuedSynchronizer、各种锁的实现(...(如CountDownLatch、CyclicBarrier、Phaser、Exchanger等)...
并发工具类章节介绍了Concurrent包中的工具,如Semaphore、CountDownLatch和CyclicBarrier,它们提供了高级的线程同步和协作机制。 第二部分则可能涉及Java的GUI编程、JDBC数据库访问、JavaFX、Java与Web服务的集成...
4. **并发工具类**:如CountDownLatch、CyclicBarrier等,讨论它们在实际项目中的应用案例。 5. **原子操作**:了解AtomicInteger等原子类的内部实现机制,以及与synchronized关键字的区别。 ### 高级主题 1. **...
6. **多线程编程**:Java提供了内置的多线程支持,包括Thread类和Runnable接口,书中会介绍线程的创建、同步与通信,以及并发工具类如Semaphore、CyclicBarrier等。 7. **网络编程**:Java的Socket编程是进行网络...
此外,还会讲解Java的并发工具类,如Semaphore和CyclicBarrier,它们在处理网络资源时非常有用。 5. **Chapter 18** - 客户端-服务器架构 这一章将深入探讨客户端-服务器模型,包括如何设计和实现一个简单的服务器...
在《Java核心技术第8版卷二》中,作者深入讲解了Java的线程模型,包括线程的创建与管理、同步机制(如synchronized和volatile关键字)以及高级并发工具如ExecutorService、Semaphore和CyclicBarrier。这些内容有助于...
在《Java高并发程序设计》这本书中,作者葛一鸣和郭超系统地介绍了高并发编程的基础理论与实践技巧。高并发是指系统能够同时处理大量请求的能力,是现代互联网应用和服务不可或缺的一个特性。随着互联网技术的发展,...
5. **多线程**:Java内置了对多线程的支持,书中有章节讲解如何创建和管理线程,包括同步机制(如synchronized关键字和Lock接口),以及并发工具类,如Semaphore和CyclicBarrier。 6. **输入/输出(I/O)**:Java I...
书中详细介绍了线程的创建与管理,线程同步机制如synchronized关键字、wait()和notify()方法,以及更高级的并发工具类如ExecutorService、Semaphore、CyclicBarrier和CountDownLatch等。 2. **网络编程**:Java提供...
- **原子类与并发工具类**:介绍Java并发包中提供的原子类(如`AtomicInteger`)、`CountDownLatch`、`CyclicBarrier`等高级工具类的功能及应用场景。 #### 5. 文件I/O与网络编程 - **NIO与AIO**:探讨Java NIO(非...
1. **多线程**:Java提供了丰富的多线程支持,包括Thread类和Runnable接口,以及并发工具类如Semaphore、CyclicBarrier和CountDownLatch。书中会深入讲解如何设计和管理线程,避免并发问题,以及使用ExecutorService...
- **并发工具类**:介绍ExecutorService、Semaphore、CyclicBarrier、CountDownLatch等并发工具。 4. **集合框架** - **List、Set、Queue的区别**:解释它们各自的特点和适用场景。 - **HashMap与HashTable**:...