`
iamzhongyong
  • 浏览: 806672 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【原】CountDownLatch使用

    博客分类:
  • java
 
阅读更多

 

最近遇到一个问题,需要批量的从数据库中读取数据,但是对于数据的处理需要等待一部分完成之后再进行下一批的数据。抽象出来就是一个任务,分成N份来执行,每一份由多个线程去执行,一份完成之后再执行下一份。于是想起了CountDownLatch

网上关于CountDownLatch的文章很多,搜了一些,也大体看了一下,但是感觉最好的还是CountDownLatch官方代码里面的两个例子,现在把这两个例子简单说明一下。

CountDownLatch一个线程同步的工具,是的一个或者多个线程等待其他线程操作完成之后再执行。

CountDownLatch通过一个给定的数值count来进行初始化,方法await()一直阻塞直到当前的count到达零为止,count的数值通过countDown()方法来减1count的数值一旦设定就不能再修改,如果需要进行修改,请考虑使用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
分享到:
评论
1 楼 TrueBrian 2015-03-17  
     
|||||||||||||||||||||
||||||||||||||||||||
||||||||||||||||||||
|||||||||||||||||||
|||||||||||||||||||
||||||||||||||||||
||||||||||||||||||
|||||||||||||||||
|||||||||||||||||
||||||||||||||||
||||||||||||||||
|||||||||||||||
|||||||||||||||
||||||||||||||
||||||||||||||
|||||||||||||
|||||||||||||
||||||||||||
||||||||||||
|||||||||||
|||||||||||
||||||||||
||||||||||
|||||||||
|||||||||
||||||||
||||||||
|||||||
|||||||
||||||
||||||
|||||
|||||
||||
||||
|||
|||
||
||
|
|

相关推荐

    Java核心技术卷+2+高级特性+原书第8版

    并发工具类章节介绍了Concurrent包中的工具,如Semaphore、CountDownLatch和CyclicBarrier,它们提供了高级的线程同步和协作机制。 第二部分则可能涉及Java的GUI编程、JDBC数据库访问、JavaFX、Java与Web服务的集成...

    Java语言程序设计.进阶篇(原书第8版)

    进阶篇(原书第8版)》主要关注的是Java编程语言的高级应用和技术深化。虽然部分内容仅提供了下载链接,并没有具体介绍书籍的内容,但基于书名及通常此类书籍会涵盖的主题,下面将从几个关键领域来探讨书中可能涉及的...

    JAVA编程技巧 原代码

    原代码可能包含如何使用`try-catch-finally`,如何自定义异常,以及何时使用`throws`关键字等内容。 4. **多线程**:JAVA提供了强大的多线程支持,学习如何创建和管理线程,理解同步机制如`synchronized`关键字,...

    ( Java核心技术 卷II 高级特性(原书第9版).zip )PDF 高清版

    书中会详细讲解线程的创建、同步、通信以及并发工具类的使用,如Semaphore、CountDownLatch、CyclicBarrier等,以及如何避免死锁和竞态条件。 2. **网络编程**:Java提供了丰富的网络编程API,包括Socket、...

    Java 语言程序设计-进阶篇(原书第10版).pdf

    《Java 语言程序设计-进阶篇》是学习Java编程的高级教程,源自原书第10版,针对已经掌握了Java基础知识的读者,深入探讨了Java的高级特性和技术。这本书涵盖了多个关键知识点,旨在帮助开发者提升Java编程技能,...

    Java核心技术(卷2):高级特性(原书第9版)

    此外,还会涉及`synchronized`关键字、`volatile`变量、`java.util.concurrent`包中的工具类,如`Semaphore`和`CountDownLatch`,以及`java.util.concurrent.locks`包中的锁机制。 2. **反射与动态代理**:Java反射...

    Java核心技术(原书第8版)卷I、卷II

    - **并发工具类**:介绍Java并发包中的工具类,如ExecutorService、Semaphore、CountDownLatch等。 **4. 图形用户界面** - **Swing组件**:学习如何使用Swing来开发桌面应用程序。 - **事件处理模型**:理解Swing...

    Java语言程序设计-进阶篇(原书第8版).pdf

    - **并发工具类**:学习CountDownLatch、CyclicBarrier、Semaphore等工具类的使用方法及其背后的原理。 - **原子操作与锁**:探讨Atomic类族、显式锁等技术在多线程环境下的作用。 #### 3. 面向对象设计原则与模式 ...

    JAVA核心技术 卷II:高级特性(原书第8版).pdf

    10. **并发工具**:Java提供了许多高级并发工具,如ConcurrentHashMap、CountDownLatch、CyclicBarrier等,这些工具能帮助开发者编写高效的多线程应用。 11. **注解(Annotation)**:注解是元数据的一种形式,可以...

    Thanking in Java原版及答案

    "原版及答案"的标题表明这不仅包含原文本,还有配套的练习答案,这对于读者自我检验学习效果,理解和掌握Java编程技能尤为关键。 描述中的"教程已经教程的练习答案(代码)"意味着资源包括了完整的教学内容和实际的...

    笔记-2、线程的并发工具类2

    CountDownLatch是单次使用的,一旦计数器归零,它就不能再重置。 3. **CyclicBarrier** CyclicBarrier是一个循环屏障,允许一组线程互相等待,直到所有线程都到达屏障点后一起继续执行。与CountDownLatch不同,...

    Java核心技术 原书第9版 2卷全

    《Java核心技术 原书第9版 2卷全》是Java编程领域的经典之作,它全面覆盖了Java语言的基础知识和高级特性。本套书籍基于Java 7进行了全面的更新,旨在帮助读者深入理解Java编程的核心概念和技术。下面将详细阐述书中...

    Java核心技术卷I 卷II 原书中文第8版 非扫描

    《Java核心技术卷I & 卷II 原书中文第8版》是Java开发者不可或缺的经典教程,涵盖了Java语言的各个方面,旨在帮助读者深入理解和熟练掌握Java编程技术。本套书籍分为两卷,卷I主要讲解基础知识,卷II则探讨更高级的...

    JAVA2核心技术.卷II高级特性.原代码

    12. **并发工具类**:Java并发包(java.util.concurrent)提供了各种并发工具,如Semaphore、CountDownLatch、CyclicBarrier等,帮助开发者更安全、高效地编写并发程序。 以上知识点构成了《JAVA2核心技术.卷II高级...

    Java语言程序设计-进阶篇(原书第8版)

    根据提供的信息,“Java语言程序设计-进阶篇(原书第8版)”这本书主要针对有一定基础的Java开发者,旨在帮助他们深入理解Java编程的核心概念和技术,并掌握更高级的应用技巧。虽然描述部分没有给出具体内容,但从书名...

    Java核心技术 卷Ⅱ高级特性(原书第8版)[中文]

    9. **并发编程**:Java提供了丰富的并发工具类和并发模型,如并发集合、线程池、CountDownLatch、CyclicBarrier等。书中会讲解如何有效地设计和管理并发程序,避免线程安全问题。 10. **垃圾收集机制**:Java的自动...

    JAVA核心技术(卷1、卷2)(原书第9版译)

    《JAVA核心技术(卷1、卷2)(原书第9版译)》是全面深入学习Java编程语言的重要参考资料,尤其适合已经有一定编程基础的学习者。这本书分为两卷,卷1主要涵盖了Java的基础概念和技术,卷2则更深入地探讨了高级特性和...

    Java核心技术 卷1 基础知识 原书第9版 中文版

    8. **多线程**:Java支持多线程编程,书中讲解了Thread类、Runnable接口、线程同步机制(如synchronized关键字、wait/notify、Lock接口)、并发工具类(如Semaphore、CountDownLatch、CyclicBarrier)以及并发集合。...

    JAVA核心技术第一卷-原书第9版

    7. **多线程编程**:JAVA提供了丰富的多线程支持,包括线程的创建、同步机制(如synchronized关键字、wait/notify、Lock接口)以及并发工具类,如ExecutorService、Semaphore、CountDownLatch等。 8. **网络编程**...

Global site tag (gtag.js) - Google Analytics