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(); } } }
相关推荐
JAVA多线程CountDownLatch使用详解 JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。...
- **CyclicBarrier和CountDownLatch**:协调多个线程之间的同步,让它们在某个点一起开始或等待。 4. **死锁** 当两个或更多线程互相等待对方释放资源时,就会发生死锁。Java提供了`java.util.concurrent.locks....
以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
2. **线程状态**:Java线程有五种状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。了解这些状态有助于理解和解决线程同步问题。 3. **线程同步**:为避免多线程...
CountDownLatch 是 Java 中的一个同步工具类,位于 `java.util.concurrent` 包下,它主要用于多线程间的协作,尤其在需要等待所有线程执行完指定任务后才能继续执行的情况。这个类通过一个计数器(计数down)来实现...
Java线程有10个优先级,`Thread.NORM_PRIORITY`是默认优先级,`Thread.MIN_PRIORITY`和`Thread.MAX_PRIORITY`分别是最低和最高优先级。优先级高的线程更有可能获得CPU时间片。 6. **线程池**: `java.util....
此外,java.util.concurrent包中的BlockingQueue和CountDownLatch等工具类也是线程间通信的有效手段。 四、设计模式 1. 生产者消费者模式:使用BlockingQueue作为缓冲区,生产者负责将产品放入队列,消费者则从队列...
为了更好地理解和应用这些模式,提供的源码详解文件“java多线程设计模式详解”将详细展示各种模式的实现细节,通过分析源码,读者可以深入掌握Java多线程编程的核心技巧。务必花时间仔细阅读和实践,这对于提升并发...
### Java多线程编程详解 #### 一、理解多线程机制 多线程是一种让程序能够并发执行多个指令流的机制,每一个这样的指令流被称为一个线程,它们彼此独立运行。线程与进程相似之处在于都有独立的执行控制,但不同的...
### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...
Java线程有三个优先级:`MIN_PRIORITY`(1),`NORM_PRIORITY`(5),`MAX_PRIORITY`(10)。优先级高的线程可能比优先级低的线程先执行,但这不保证。 9. **Future和Callable接口**: `Callable`接口类似于`Runnable`...
Java API中提供了大量工具类和接口来支持多线程编程,如Executor框架、Future接口、Callable任务、CyclicBarrier和CountDownLatch等同步工具。这些工具可以帮助开发者更好地控制和协调多线程任务,实现高效并发。 ...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程的实现...通过阅读《Java多线程编程详解.pdf》这样的资料,可以系统学习和掌握这些知识。
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...
Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...