- 浏览: 806585 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
huan19900606:
像haskell这些脚本语言很容易定义DSL,实现对应的词法语 ...
DSL的基本介绍(groovy来进行构建) -
express_wind:
https://yq.aliyun.com/album/130 ...
qlexpress规则引擎初探 -
readxuxuegang:
博主你好。如果groovy的代码是保存在数据库里,不是文件,这 ...
在java中使用groovy怎么搞 (java and groovy) -
express_wind:
hi,兄弟,有没有兴趣来阿里巴巴专门做这方面的研究,https ...
qlexpress规则引擎初探 -
langcaiye:
有2个问题请教:1. 这里的base32算法为什么需要以负数的 ...
【原】geohash算法详解
最近遇到一个问题,需要批量的从数据库中读取数据,但是对于数据的处理需要等待一部分完成之后再进行下一批的数据。抽象出来就是一个任务,分成N份来执行,每一份由多个线程去执行,一份完成之后再执行下一份。于是想起了CountDownLatch。
网上关于CountDownLatch的文章很多,搜了一些,也大体看了一下,但是感觉最好的还是CountDownLatch官方代码里面的两个例子,现在把这两个例子简单说明一下。
CountDownLatch一个线程同步的工具,是的一个或者多个线程等待其他线程操作完成之后再执行。
CountDownLatch通过一个给定的数值count来进行初始化,方法await()一直阻塞直到当前的count到达零为止,count的数值通过countDown()方法来减1,count的数值一旦设定就不能再修改,如果需要进行修改,请考虑使用CyclicBarrier。
大体看了一下源代码,是通过同步队列来作为计数器来进行控制的。同步队列是在CountDownLatch内部实现了一个静态内部类,countDown()通过调用队列来减1。
有两个典型的应用场景:
第一种是一个开始的信号,所有的task任务等待这个信号。类似于百米赛跑中的信号员,所有的运动员都做好准备,等待信号,信号一来,那就开始运行。
第二种是将一个任务分支N部分由M个线程来处理,等待所有的线程M完成任务后做其他的事情,还是刚才的例子,所有运动员跑完之后,才能知道所有人员的排名情况。
public class CountDownLatchTest { public static void main(String[] args) throws Exception{ CountDownLatch s = new CountDownLatch(1); CountDownLatch e = new CountDownLatch(6); for(int i=0;i<6;i++){ new Thread(new Worker(s,e)).start(); } System.out.println("i am the judge ,now ,i start the singal"); s.countDown(); System.out.println("waiting all task over"+e.getCount()); e.await(); System.out.println("all is over"); } } class Worker implements Runnable{ private final CountDownLatch startSingal ; private final CountDownLatch endSingal; public Worker(CountDownLatch startSingal, CountDownLatch endSingal) { super(); this.startSingal = startSingal; this.endSingal = endSingal; } public void run() { try { System.out.println(Thread.currentThread().getName()+"waiting the start singal...."+startSingal.getCount()); //等待开始信号信号 startSingal.await(); System.out.println(Thread.currentThread().getName()+"start to executer"); //结束的计数器减一 endSingal.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }
执行结果:
Thread-0waiting the start singal....1
Thread-2waiting the start singal....1
Thread-1waiting the start singal....1
i am the judge ,now ,i start the singal
waiting all task over6
Thread-1start to executer
Thread-3waiting the start singal....1
Thread-4waiting the start singal....1
Thread-3start to executer
Thread-5waiting the start singal....0
Thread-5start to executer
Thread-2start to executer
Thread-0start to executer
Thread-4start to executer
all is over
public static void main(String[] args) throws Exception{ CountDownLatch latch = new CountDownLatch(6); Executor e = Executors.newFixedThreadPool(6); System.out.println("thread number is 6,now start"); for(int i=0;i<6;i++){ e.execute(new Worker(latch,i)); } System.out.println("waiting all is over "); latch.await(); System.out.println("all is over"); } } class Worker implements Runnable{ private final CountDownLatch number; private int temp; public Worker(CountDownLatch number, int temp) { super(); this.number = number; this.temp = temp; } public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println(Thread.currentThread().getName()+"runnable - "+temp); number.countDown(); } }
写道
thread number is 6,now start
waiting all is over
pool-1-thread-4runnable - 3
pool-1-thread-5runnable - 4
pool-1-thread-1runnable - 0
pool-1-thread-3runnable - 2
pool-1-thread-2runnable - 1
pool-1-thread-6runnable - 5
all is over
waiting all is over
pool-1-thread-4runnable - 3
pool-1-thread-5runnable - 4
pool-1-thread-1runnable - 0
pool-1-thread-3runnable - 2
pool-1-thread-2runnable - 1
pool-1-thread-6runnable - 5
all is over
评论
1 楼
TrueBrian
2015-03-17
|
发表评论
-
系统分布式情况下最终一致性方案梳理
2015-09-05 19:34 40960前言 目前的应用系 ... -
Storm核心概念剖析
2015-03-20 20:42 3227最近团队中有分析的场 ... -
池和流的两种数据处理方式
2014-11-19 22:59 1393在抽象层面,想了一下,目前很多的数据处理形式,一般分为池和流 ... -
关于CodeReview(java)
2014-10-29 20:42 1907关于codereview,在平时的开发中,经常忽略的环节,参 ... -
java中各种各样的数据结构
2014-07-13 20:26 2466在java中,有非常丰富的数据结构,可能是因为大多数的软件 ... -
关于JVM的ClassLoader(笔记)
2014-07-13 12:19 1874众所周知,java是编译型的语言,写的是java文 ... -
关于事务的几个概念介绍
2014-06-06 22:22 1943啥是事务? 有一组操 ... -
开发中遇到的编码问题
2014-05-22 19:39 18831、说到编码,最大的问题就是乱码了,为啥会有乱码呢 ? 因 ... -
ThreadLocal源代码解析
2014-04-24 17:54 2407最开始的时候,理解的ThreadLocal,我的理解是这样的 ... -
关于单例模式(代码篇)
2014-04-23 10:47 2418很早的时候,转发过一篇单例模式的文章:http://iamz ... -
今天遇到的两个spring相关的两个问题
2014-04-18 21:56 2560今天在项目中写代码,遇到两个Spring的问题,记录一下。再 ... -
Activiti中的命令模式解析
2014-04-11 13:10 3198最近在看Activiti的源代码,发现是基于命令模式进行的开 ... -
关于java中的本地缓存-总结概述
2014-03-31 19:00 18373java中的本地缓存,工作后陆续用到,一直想写,一直无从下 ... -
使用guava中的EventBus构建内存级别的事件引擎
2014-03-25 19:27 6407这个EventBus是guava中比较给力的一个类,从字面 ... -
DSL的基本介绍(groovy来进行构建)
2014-03-04 23:32 17054什么是DSL? 领域特定 ... -
qlexpress规则引擎初探
2014-02-25 22:28 25119qlexpress是啥? 这个是阿里内部的一个开源的jav ... -
在java中使用groovy怎么搞 (java and groovy)
2014-01-15 23:17 10960什么是groovy? 一种基于Java虚拟机的动态语言, ... -
java中记录方法调用时间,结果按照方法的层级树状的输出
2013-12-21 17:36 4685 在java中,最常用的埋点时间的方法就 ... -
一次CMS GC问题排查过程(理解原理+读懂GC日志)
2013-12-14 22:21 41348这个是之前处理过的一个线上问题,处理过程断断续续,经历了两 ... -
令牌桶算法和漏桶算法以及流量控制浅谈
2013-11-27 23:20 20794 在双十一等大促环节,系统需要限流,外部 ...
相关推荐
并发工具类章节介绍了Concurrent包中的工具,如Semaphore、CountDownLatch和CyclicBarrier,它们提供了高级的线程同步和协作机制。 第二部分则可能涉及Java的GUI编程、JDBC数据库访问、JavaFX、Java与Web服务的集成...
进阶篇(原书第8版)》主要关注的是Java编程语言的高级应用和技术深化。虽然部分内容仅提供了下载链接,并没有具体介绍书籍的内容,但基于书名及通常此类书籍会涵盖的主题,下面将从几个关键领域来探讨书中可能涉及的...
原代码可能包含如何使用`try-catch-finally`,如何自定义异常,以及何时使用`throws`关键字等内容。 4. **多线程**:JAVA提供了强大的多线程支持,学习如何创建和管理线程,理解同步机制如`synchronized`关键字,...
书中会详细讲解线程的创建、同步、通信以及并发工具类的使用,如Semaphore、CountDownLatch、CyclicBarrier等,以及如何避免死锁和竞态条件。 2. **网络编程**:Java提供了丰富的网络编程API,包括Socket、...
《Java 语言程序设计-进阶篇》是学习Java编程的高级教程,源自原书第10版,针对已经掌握了Java基础知识的读者,深入探讨了Java的高级特性和技术。这本书涵盖了多个关键知识点,旨在帮助开发者提升Java编程技能,...
此外,还会涉及`synchronized`关键字、`volatile`变量、`java.util.concurrent`包中的工具类,如`Semaphore`和`CountDownLatch`,以及`java.util.concurrent.locks`包中的锁机制。 2. **反射与动态代理**:Java反射...
- **并发工具类**:介绍Java并发包中的工具类,如ExecutorService、Semaphore、CountDownLatch等。 **4. 图形用户界面** - **Swing组件**:学习如何使用Swing来开发桌面应用程序。 - **事件处理模型**:理解Swing...
- **并发工具类**:学习CountDownLatch、CyclicBarrier、Semaphore等工具类的使用方法及其背后的原理。 - **原子操作与锁**:探讨Atomic类族、显式锁等技术在多线程环境下的作用。 #### 3. 面向对象设计原则与模式 ...
10. **并发工具**:Java提供了许多高级并发工具,如ConcurrentHashMap、CountDownLatch、CyclicBarrier等,这些工具能帮助开发者编写高效的多线程应用。 11. **注解(Annotation)**:注解是元数据的一种形式,可以...
"原版及答案"的标题表明这不仅包含原文本,还有配套的练习答案,这对于读者自我检验学习效果,理解和掌握Java编程技能尤为关键。 描述中的"教程已经教程的练习答案(代码)"意味着资源包括了完整的教学内容和实际的...
CountDownLatch是单次使用的,一旦计数器归零,它就不能再重置。 3. **CyclicBarrier** CyclicBarrier是一个循环屏障,允许一组线程互相等待,直到所有线程都到达屏障点后一起继续执行。与CountDownLatch不同,...
《Java核心技术 原书第9版 2卷全》是Java编程领域的经典之作,它全面覆盖了Java语言的基础知识和高级特性。本套书籍基于Java 7进行了全面的更新,旨在帮助读者深入理解Java编程的核心概念和技术。下面将详细阐述书中...
《Java核心技术卷I & 卷II 原书中文第8版》是Java开发者不可或缺的经典教程,涵盖了Java语言的各个方面,旨在帮助读者深入理解和熟练掌握Java编程技术。本套书籍分为两卷,卷I主要讲解基础知识,卷II则探讨更高级的...
12. **并发工具类**:Java并发包(java.util.concurrent)提供了各种并发工具,如Semaphore、CountDownLatch、CyclicBarrier等,帮助开发者更安全、高效地编写并发程序。 以上知识点构成了《JAVA2核心技术.卷II高级...
根据提供的信息,“Java语言程序设计-进阶篇(原书第8版)”这本书主要针对有一定基础的Java开发者,旨在帮助他们深入理解Java编程的核心概念和技术,并掌握更高级的应用技巧。虽然描述部分没有给出具体内容,但从书名...
9. **并发编程**:Java提供了丰富的并发工具类和并发模型,如并发集合、线程池、CountDownLatch、CyclicBarrier等。书中会讲解如何有效地设计和管理并发程序,避免线程安全问题。 10. **垃圾收集机制**:Java的自动...
《JAVA核心技术(卷1、卷2)(原书第9版译)》是全面深入学习Java编程语言的重要参考资料,尤其适合已经有一定编程基础的学习者。这本书分为两卷,卷1主要涵盖了Java的基础概念和技术,卷2则更深入地探讨了高级特性和...
8. **多线程**:Java支持多线程编程,书中讲解了Thread类、Runnable接口、线程同步机制(如synchronized关键字、wait/notify、Lock接口)、并发工具类(如Semaphore、CountDownLatch、CyclicBarrier)以及并发集合。...
7. **多线程编程**:JAVA提供了丰富的多线程支持,包括线程的创建、同步机制(如synchronized关键字、wait/notify、Lock接口)以及并发工具类,如ExecutorService、Semaphore、CountDownLatch等。 8. **网络编程**...