CountDownLatch/门栓,在完成一组其它线程中执行的操作之前,该线程(可以是多个)一直等待。
相信大家遇到过这样场景:在进行某个操作之前,先需要加载不同数据源的一系列数据,而每个加载可能相当耗时,客户端就只能一直等待。
Demo:举行一个小型会议,所有人到齐了才能开会,如果有人迟到,大家一起干等。
1.模拟会议进度线程
package java7.lesson4_CountdownLatch; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; import util.Util; public class Videoconference implements Runnable{ private final CountDownLatch controller; private final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss "); public Videoconference(int num){ this.controller = new CountDownLatch(num); } public void arrive(String name){ Util.sop(df.format(new Date())+name+"来到了会议室"); controller.countDown(); Util.sop("还有"+controller.getCount()+"还未到达"); } @Override public void run() { Util.sop("本次会议预计"+controller.getCount()+"人到会"); try { controller.await(); } catch (InterruptedException e) { e.printStackTrace(); } Util.sop(df.format(new Date())+"全部到齐,会议开始"); } }
说明:在countDown到0之前,该线程阻塞在await()处,倒计数为0,继续往下执行。
2.与会者线程
package java7.lesson4_CountdownLatch; public class Participant implements Runnable{ private final String name; private final Videoconference room; public Participant(String name,Videoconference room){ this.name = name; this.room = room; } @Override public void run() { try { Thread.sleep((long)(Math.random()*5000)); } catch (InterruptedException e) { e.printStackTrace(); } room.arrive(this.name); } }
3.测试
package java7.lesson4_CountdownLatch; public class Client { public static void main(String[] args) { Videoconference room = new Videoconference(5); new Thread(room).start(); new Thread(new Participant("领导", room)).start(); new Thread(new Participant("员工1", room)).start(); new Thread(new Participant("员工2", room)).start(); new Thread(new Participant("员工3", room)).start(); new Thread(new Participant("员工4", room)).start(); } }
测试结果:
本次会议预计5人到会 2014-08-30 18:31:50 员工1来到了会议室 还有4还未到达 2014-08-30 18:31:50 领导来到了会议室 还有3还未到达 2014-08-30 18:31:51 员工2来到了会议室 还有2还未到达 2014-08-30 18:31:52 员工3来到了会议室 还有1还未到达 2014-08-30 18:31:53 员工4来到了会议室 还有0还未到达 2014-08-30 18:31:53 全部到齐,会议开始
结果符合预期。
CountDownLatch比较简单,但比较实用:
1.多个线程的进行准备工作,再开始后续工作。
2.多个线程阻塞在await(),等待countdown到0,一起开始工作(比如一些测试场合)
另外,CountDownLatch不能被重置,只能重新new一个。
相关推荐
Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以用于协调多个线程间的活动,等待所有线程完成各自的任务后,主线程或其他线程才能继续执行。 ...
在Java语言中,多线程同步机制的实现可以通过synchronized关键字、ReentrantLock类、 Semaphore类、CountDownLatch类等来实现。 1. 使用synchronized关键字 使用synchronized关键字可以对方法或者代码块进行同步。...
在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...
总结来说,CountDownLatch和CyclicBarrier都是Java并发编程中的重要工具,它们可以帮助开发者协调多线程间的同步行为。CountDownLatch更适合于一次性使用的场景,用于让一个线程等待其他线程完成特定操作,而...
在Java并发编程中,`CountDownLatch`是一个同步辅助类,它允许多个线程等待其他线程完成操作。在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`...
Java中的CountDownLatch是一种多线程同步工具类,它在并发编程中扮演着重要角色,尤其在需要等待一组任务完成后再进行下一步操作的场景下。CountDownLatch的命名来源于其功能,"count down"意味着计数器向下递减,...
5. **并发工具类**:Java并发包(java.util.concurrent)中包含许多工具类,如Semaphore(信号量)、CountDownLatch(倒计时锁)、CyclicBarrier(回环栅栏)和Exchanger(交换器),它们是设计复杂多线程同步场景的...
CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对CountDownLatch的详细解释和实例代码。 CountDownLatch的...
另一种常见的同步工具是java.util.concurrent包下的Semaphore类,它可以看作是一种计数信号量,控制同时访问特定资源的线程数量。Semaphore通常用于限制同时访问某些资源的线程数量,如数据库连接池。 ```java ...
- `CyclicBarrier`和`CountDownLatch`:用于线程同步,协调多个线程同时开始或结束操作。 了解并熟练掌握这些知识点,你就能在实际开发中灵活运用Java的多线程特性,编写出高效、稳定的并发程序。通过实践和不断...
1. **事件对象**: 在许多编程语言中,如Java和C#,都有内置的事件类或结构,如Java的`java.util.concurrent.CountDownLatch`,C#的`System.Threading.EventWaitHandle`。事件对象通常包含两个关键状态:未设置...
- `java.util.concurrent.CountDownLatch`:用于协调多个线程,例如等待所有线程完成后再继续执行。 - `java.util.concurrent.CyclicBarrier`:允许一组线程等待其他线程到达一个公共屏障点后,再一起继续执行。 ...
4. **CountDownLatch**:这是一个一次性使用的同步辅助类,用于让一组线程等待其他线程完成操作。在批量处理中,主线程可能使用CountDownLatch来等待所有子线程完成任务,然后继续执行后续操作。 5. **...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
高级实用工具类是`java.util.concurrent`的核心,包括线程安全集合(如ConcurrentHashMap、CopyOnWriteArrayList等)、线程池(ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor等)、信号...
如何使用CountDownLatch同步java多线程 CountDownLatch 是 Java 并发编程中的一种常用工具,用于控制多个线程的并发执行。它可以实现多个线程之间的同步操作,使得线程之间可以协调工作,避免了线程之间的互相干扰...
- **高级特性**:包括`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`、`CyclicBarrier`、`Exchanger`等工具,提供了更灵活、强大的线程调度和控制机制。 - **优势**:减少线程管理的复杂度,提高线程...
在Java中,我们可以使用`java.util.concurrent`包中的`Semaphore`、`CountDownLatch`或`CyclicBarrier`类来实现事件同步;而在Python中,可以使用`threading.Event`类。 以Java为例,我们可以创建一个`Event`对象,...
线程同步是多线程编程中的一个重要概念,它主要用于解决多个线程并发访问共享资源时可能出现的竞争条件问题。在这个名为“线程同步的一个小程序”中,我们可以推测这是一段用于实验和理解线程同步机制的代码。下面...
1. 同步机制:为了解决多线程并发访问共享资源导致的数据不一致问题,Java提供了synchronized关键字、Lock接口(如ReentrantLock)以及相关的并发工具类。 2. synchronized:用于修饰方法或代码块,实现互斥访问。...