`
747017186
  • 浏览: 331421 次
社区版块
存档分类
最新评论

java线程之CountDownLatch详解

 
阅读更多

CountDownLatch的简单理解

CountDownLatch的概念

CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。

CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。

CountDownLatch的用法

CountDownLatch典型用法1:某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为n new CountDownLatch(n) ,每当一个任务线程执行完毕,就将计数器减1 countdownlatch.countDown(),当计数器的值变为0时,在CountDownLatch上 await() 的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

CountDownLatch典型用法2:实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的CountDownLatch(1),将其计数器初始化为1,多个线程在开始执行任务前首先 coundownlatch.await(),当主线程调用 countDown() 时,计数器变为0,多个线程同时被唤醒。

CountDownLatch的不足

CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

 

看下面的例子:

 

package thread.countdownlatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {
	public static void main(String[] args) {
		ExecutorService pool = Executors.newCachedThreadPool();//线程缓存池
		final CountDownLatch main = new CountDownLatch(3);//主线程创建3个计数
		final CountDownLatch sub = new CountDownLatch(1);//子线程创建1个计数
		
		
		for (int i = 0; i < 3; i++) {
			final int c = i;
			pool.execute(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep((long)(Math.random()*10000));
						System.out.println("线程"+Thread.currentThread().getName()+"已经到达起跑线,准备就绪!");
						main.countDown();//每次主线程定时都减去1,主线程定时减到0的时候,主线程就被唤醒
						sub.await();//所有的子线程到达这之后,必须等待
						System.out.println("线程"+Thread.currentThread().getName()+"开始跑步---》到达终点!");
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally {
						
					}
				}
			});
		}
		pool.shutdown();
		
		try {
			main.await();//开始时主线程被阻塞
			Thread.sleep((long)(Math.random()*10000));
			System.out.println("线程"+Thread.currentThread().getName()+"准备就绪!");
			System.out.println("线程"+Thread.currentThread().getName()+"发起跑令!");
			sub.countDown();//子线程减到1被唤醒继续执行
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


  
 
 
 
 
 
 

 

 

  • 大小: 12.6 KB
分享到:
评论

相关推荐

    JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch使用详解 JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。...

    java+多线程+同步详解源码整理

    - **CyclicBarrier和CountDownLatch**:协调多个线程之间的同步,让它们在某个点一起开始或等待。 4. **死锁** 当两个或更多线程互相等待对方释放资源时,就会发生死锁。Java提供了`java.util.concurrent.locks....

    Java多线程详解

    以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    java多线程设计模式详解+源码

    2. **线程状态**:Java线程有五种状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。了解这些状态有助于理解和解决线程同步问题。 3. **线程同步**:为避免多线程...

    CountDownLatch详解.docx

    CountDownLatch 是 Java 中的一个同步工具类,位于 `java.util.concurrent` 包下,它主要用于多线程间的协作,尤其在需要等待所有线程执行完指定任务后才能继续执行的情况。这个类通过一个计数器(计数down)来实现...

    java多线程编程详解

    Java线程有10个优先级,`Thread.NORM_PRIORITY`是默认优先级,`Thread.MIN_PRIORITY`和`Thread.MAX_PRIORITY`分别是最低和最高优先级。优先级高的线程更有可能获得CPU时间片。 6. **线程池**: `java.util....

    java多线程设计模式详解.rar

    此外,java.util.concurrent包中的BlockingQueue和CountDownLatch等工具类也是线程间通信的有效手段。 四、设计模式 1. 生产者消费者模式:使用BlockingQueue作为缓冲区,生产者负责将产品放入队列,消费者则从队列...

    java多线程设计模式详解

    为了更好地理解和应用这些模式,提供的源码详解文件“java多线程设计模式详解”将详细展示各种模式的实现细节,通过分析源码,读者可以深入掌握Java多线程编程的核心技巧。务必花时间仔细阅读和实践,这对于提升并发...

    Java多线程编程详解

    ### Java多线程编程详解 #### 一、理解多线程机制 多线程是一种让程序能够并发执行多个指令流的机制,每一个这样的指令流被称为一个线程,它们彼此独立运行。线程与进程相似之处在于都有独立的执行控制,但不同的...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    JAVA多线程编程详解-详细操作例子

    Java线程有三个优先级:`MIN_PRIORITY`(1),`NORM_PRIORITY`(5),`MAX_PRIORITY`(10)。优先级高的线程可能比优先级低的线程先执行,但这不保证。 9. **Future和Callable接口**: `Callable`接口类似于`Runnable`...

    java多线程设计模式详解(PDF及源码)

    Java API中提供了大量工具类和接口来支持多线程编程,如Executor框架、Future接口、Callable任务、CyclicBarrier和CountDownLatch等同步工具。这些工具可以帮助开发者更好地控制和协调多线程任务,实现高效并发。 ...

    Java 多线程编程详解

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程的实现...通过阅读《Java多线程编程详解.pdf》这样的资料,可以系统学习和掌握这些知识。

    Java线程培训资料

    ### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...

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

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

Global site tag (gtag.js) - Google Analytics