参考:http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html
在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后此行,从jdk1.5开始就可以使用CountDownLatch实现,
CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器 减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
下面举一个等车的例子:
10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开:
import java.util.Random; import java.util.concurrent.TimeUnit; public class Student { private int myNum; public Student(int num) { this.myNum = num; } public boolean getOn() throws InterruptedException { //Thread.currentThread().sleep(new Random().nextInt(2) * 1000);// 小朋友上车是需要时间的 //TimeUnit.MICROSECONDS.sleep(new Random().nextInt(2) * 1000);// JDK1.5 后使用这个方式 TimeUnit.SECONDS.sleep(2); if (CountDownLatchTest.isGone) { return false; } System.out.print("编号为:"+myNum+"的同学上车了.."); return true; } }
import java.util.concurrent.CountDownLatch; public class GetOn implements Runnable { private CountDownLatch countDownLatch; public GetOn(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 0; i < CountDownLatchTest.numberOfPeople; i++) { try { if (CountDownLatchTest.isGone) { System.out.println("还差:"+countDownLatch.getCount()+" 个没娃上车呢.怎么车走了"); break; } boolean goonSuccess = new Student(i + 1).getOn();//顺序上车 if (goonSuccess) { // 每当小朋友上车成功后,就调用 countDown() 进行减1操作 countDownLatch.countDown(); } } catch (InterruptedException e) {} if (countDownLatch.getCount() != 0) { System.out.println("还差:"+(countDownLatch.getCount())+" 个没上车"); } else { System.out.println("都上车了"); } } } }
import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class CountDownLatchTest { public static int numberOfPeople = 10;//等车的学生数 public static boolean isGone = false;//车开的标志 public static int carWaitTime = 8;//车等的时间 public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(numberOfPeople); new Thread(new GetOn(countDownLatch)).start(); waitStudentGetOn(countDownLatch); //等所有的学生上车 driveHome(); } public static void waitStudentGetOn(CountDownLatch waitStudentsGetOn) throws InterruptedException { System.out.println("赶紧的,抓紧时间上车.."); //waitStudentsGetOn.await(carWaitTime, TimeUnit.SECONDS);//等5秒,还没上车,就开走。。 waitStudentsGetOn.await();// 等待所有人都上车,才走开 } public static void driveHome() throws InterruptedException { System.out.println("开车,鞋儿破 帽儿破 身上的袈裟破 你笑我 他笑我 一把扇儿破"); isGone = true; } }
相关推荐
4. **一次性使用**: 一旦计数器归0,`await()`将不再阻塞任何线程,且CountDownLatch不能重置,只能一次性使用。 **CyclicBarrier** CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达...
CountDownLatch使用实例 - 初始化时,设置计数(count)值,也就是闭锁需要等待的线程数。 - 主线程必须在启动其他线程后立即调用 CountDownLatch.await() 方法,这样主线程的操作就会在这个方法上阻塞,直到其他...
1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....
1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...
Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...
本文将深入探讨CountDownLatch的工作原理、使用方法以及它在并发编程中的应用场景。 1. **CountDownLatch简介** CountDownLatch是一个计数器,初始化时设置一个初始值,然后多个线程可以等待这个计数器归零。一旦...
在`CountDownLatch`实例化时,计数器设置为这个初始值。每当调用`countDown()`方法时,计数器就会减1。当计数器的值为0时,任何因调用`await()`而阻塞的线程都将被释放并继续执行。这使得`CountDownLatch`成为一个...
程序创建了一个ExecutorService来管理线程池,然后创建了两个CountDownLatch实例:`cdOrder`和`cdAnswer`。`cdOrder`表示裁判发布的命令,计数器为1,意味着所有运动员必须等待裁判的命令才能开始。`cdAnswer`表示...
在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并探讨相关的知识点。 CountDownLatch 的工作原理 CountDownLatch 的工作原理基于计数器的概念。它维护一个计数器,初始值是指定的整数。每当一...
在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。然后创建了2个等待线程,它们会在调用 `await()` 后进入等待状态。接着启动所有线程,工作线程在运行后调用 ...
下面是一个使用CountDownLatch的实例,模拟了运动员比赛的场景: public class TestCountDownLatch { private static final int RUNNER_NUMBER = 5; // 运动员个数 private static final Random RANDOM = new ...
- 在`MergeMisRpt`方法中,创建了一个`CountDownLatch`实例,其计数值等于`vTop`,即时间跨度。 - 使用一个`for`循环创建并启动了多个线程,每个线程负责获取特定日期的数据。 - 每个线程内部,在执行完数据获取...
10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...
在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接完成、确保所有数据加载完毕后再开始服务等。 总结一下`CountDownLatch`的主要知识点: 1. `CountDownLatch`是...
1. **初始化:** 使用给定的计数值创建一个 CountDownLatch 实例。 2. **递减计数器:** 在需要完成的工作完成后,调用 `countDown()` 方法来递减计数器。 3. **等待:** 其他线程调用 `await()` 方法来等待计数器的...
15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...
本资源“Java高级编程实例 100个”提供了丰富的实践案例,旨在帮助初学者深入理解并熟练应用这些高级特性。 1. **多线程**:在Java中,多线程是并发执行任务的基本方式。学习如何创建Thread类的子类,使用Runnable...
使用 CountDownLatch 需要创建一个实例并传入一个初始计数值,这个计数值表示需要等待的线程数量。然后,每个需要等待的线程在完成任务后调用 `countDown()` 方法,将计数值减一。主线程或其他需要等待的线程调用 `...
Java编程基础、应用与实例是针对已有一定Java学习背景的读者设计的一套教程,旨在深化对Java编程的理解并提供实际操作的案例。本教程涵盖了Java语言的核心概念、语法特性以及在实际开发中的应用技巧。 首先,Java...
6. **多线程**:Java提供了丰富的多线程支持,源码中会包含Thread、Runnable接口的使用,以及同步机制如synchronized关键字、wait/notify机制和并发工具类(如Semaphore、CountDownLatch等)的实例。 7. **网络编程...