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

java CountDownLatch 实例

 
阅读更多
Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。
      你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。
      CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。

应用场景:实际上可以简单理解一下,初始化一个固定数量的CountDownLatch ,然后启动两组线程去操作,一组调用await方法(阻塞),一组调用countDown(将计数值减1),一直到调用countDown的那组线程将计数值减为0的时候,被阻塞的线程才开始去执行。
如果计数值不为0的时候,被阻塞的线程会继续被阻塞,直到计数值被减为0.


package thread;

import java.lang.reflect.Constructor;
import java.util.concurrent.CountDownLatch;

public class CountDownLarchDemo {

	public static void main(String[] args) throws Exception {

		CountDownLatch latch = new CountDownLatch(8);
		Th th = new Th(latch);
		Td td = new Td(latch);
		for(int i=0;i<8;i++){
			new Thread(th).start();
			new Thread(td).start();
		}
	}
}

class Th implements Runnable{
	private CountDownLatch latch;
	public Th(CountDownLatch latch){
		this.latch = latch;
	}
	@Override
	public void run() {
		try {
			latch.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"--------------is working..."+latch.getCount());
	}
}

class Td implements Runnable{
	private CountDownLatch latch;
	public  Td(CountDownLatch latch){
		this.latch = latch;
	}
	@Override
	public void run() {
		latch.countDown();
		System.out.println(Thread.currentThread().getName()+"---is watting..."+latch.getCount());
	}
}



结果为:


Thread-1---is watting...7
Thread-3---is watting...6
Thread-5---is watting...5
Thread-7---is watting...4
Thread-9---is watting...3
Thread-13---is watting...2
Thread-11---is watting...1
Thread-15---is watting...0
Thread-4--------------is working...0
Thread-12--------------is working...0
Thread-14--------------is working...0
Thread-2--------------is working...0
Thread-0--------------is working...0
Thread-10--------------is working...0
Thread-8--------------is working...0
Thread-6--------------is working...0

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    140个Java源码实例

    15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...

    Java CountDownLatch完成异步回调实例详解

    Java CountDownLatch 完成异步回调实例详解 Java 中的 CountDownLatch 是一个同步辅助类,允许一个线程等待其他线程完成操作。它是一种非常有用的工具,用于在多线程环境中实现异步回调。在本文中,我们将学习如何...

    JAVA CountDownLatch(倒计时计数器)用法实例

    JAVA CountDownLatch(倒计时计数器)用法实例 在 Java 中,CountDownLatch 是一种同步工具,允许一个或多个线程等待其他线程完成任务。它是一种倒计时器,使用计数来控制线程的执行顺序。本文将详细介绍 ...

    Java中CountDownLatch用法解析

    在Java并发编程中,`CountDownLatch`是一个非常重要的工具类,它位于`java.util.concurrent`包下,用于协调多个线程间的同步。`CountDownLatch`的主要作用是允许一个或多个线程等待其他线程完成操作。在上述例子中,...

    JAVA多线程的实例

    Java并发包`java.util.concurrent`提供了高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(计数器门闩)等,它们可以更灵活地控制线程执行。例如,`CountDownLatch`常用于...

    Java JDK 实例宝典 源代码

    10. **并发库**:Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CountDownLatch等,实例会展示如何高效地管理线程池和控制并发。 11. **Java IO/NIO**:NIO(New Input/Output)是Java的非阻塞I/O...

    JAVA实例精通源代码

    6. **多线程**:Java提供了丰富的多线程支持,源码中会包含Thread、Runnable接口的使用,以及同步机制如synchronized关键字、wait/notify机制和并发工具类(如Semaphore、CountDownLatch等)的实例。 7. **网络编程...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...

    Java高级编程实例 100个

    本资源“Java高级编程实例 100个”提供了丰富的实践案例,旨在帮助初学者深入理解并熟练应用这些高级特性。 1. **多线程**:在Java中,多线程是并发执行任务的基本方式。学习如何创建Thread类的子类,使用Runnable...

    140个Java源码实例.zip

    15. **并发工具类**:Java并发包提供了一些实用工具,如ExecutorService、Semaphore、CountDownLatch等。实例可能包含如何有效管理并发任务的代码。 每个源码实例都对应一个特定主题,通过分析和实践这些例子,...

    java高级编程100实例

    10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...

    多线程countDownLatch方法介绍

    1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....

    Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...

    Java经典实例(第2版) pdf和源代码

    《Java经典实例(第2版)》是一本深入浅出的Java编程教程,它涵盖了Java语言的各个方面,旨在帮助读者掌握Java编程的核心技能,并通过实际的示例加深理解。PDF书籍部分提供了详尽的理论解释和清晰的代码展示,而源代码...

    java JDK 实例开发宝典 源代码

    Java JDK实例开发宝典源代码是一份非常宝贵的资源,它涵盖了Java开发中的各种核心概念和技术。JDK(Java Development Kit)是Java编程的基础,包含了Java运行环境、编译器、调试器以及各种工具,是每个Java开发者...

    java多线程编程实例_Source

    Java并发包提供了如CountDownLatch、CyclicBarrier、Semaphore等并发工具类,用于协调多个线程间的协作。这些工具在分布式计算、并行任务调度等领域有广泛应用。 通过这些实例,学习者能够深入理解Java多线程编程,...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java代码实例项目

    这里可能需要用到Java的并发工具类,如CountDownLatch或者CyclicBarrier。 4. **利息计算**:根据银行的利率策略,定期计算并添加到账户余额中。这可能涉及到时间间隔的处理,可以使用Java的定时任务框架如...

Global site tag (gtag.js) - Google Analytics