`
saybody
  • 浏览: 907543 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

CountDownLatch 简介和例子

 
阅读更多
在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后此行,从jdk1.5开始就可以使用CountDownLatch实现,   
  CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
下面举一个等车的例子:
10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开: public class CountDownLatchTest {
    public static int numberOfPeople = 10;//等车的学生数
    public static boolean isGone = false;//车开的标志
    public static int carWaitTime = 3;//车等的时间
   
    public static void main(String[] args) throws InterruptedException {
       
        CountDownLatch waitStudentsGetOn = new CountDownLatch(numberOfPeople);
       
        new Thread(new GetOn(waitStudentsGetOn)).start();
       
        waitStudentGetOn(waitStudentsGetOn);//等所有的学生上车
       
        driveHome();//开车走
       
    }
   
    private static void waitStudentGetOn(CountDownLatch waitStudentsGetOn) throws InterruptedException {
        System.out.println("赶紧的,抓紧时间上车..");
        waitStudentsGetOn.await(carWaitTime, TimeUnit.SECONDS);//等5秒,还没上车,就开走。。
       
    }

    private static void driveHome() throws InterruptedException {
        System.out.println("开车,鞋儿破 帽儿破 身上的袈裟破 你笑我 他笑我 一把扇儿破");
        isGone = true;
       
    }
   
}
class GetOn implements Runnable{
   
    private CountDownLatch waitStudentsGetOn;
    GetOn(CountDownLatch waitStudentsGetOn){
        this.waitStudentsGetOn = waitStudentsGetOn;
    }
    public void run() {
        for (int i = 0; i < CountDownLatchTest.numberOfPeople; i++) {
            try {
                if(CountDownLatchTest.isGone){
                    System.out.println("妈的,还差:"+waitStudentsGetOn.getCount()+" 个没娃上车呢.怎么车走了");
                    break;
                }
                boolean goonSuccess = new Student(i+1).getOn();//顺序上车
                if(goonSuccess)waitStudentsGetOn.countDown();
            } catch (InterruptedException e) {}
                if(waitStudentsGetOn.getCount()!=0l){
                    System.out.println("还差:"+(waitStudentsGetOn.getCount())+" 个没上车");
                }else{
                    System.out.println("都上车了");
                }
        }
       
       
    }
    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);//上车使用的时间,随机
             if(CountDownLatchTest.isGone){
                 return false;//不能上了,上车失败
             }
             System.out.print("编号为:"+myNum+"的同学上车了..");
             return true;
         }
    }
}
0
2
分享到:
评论
1 楼 swen00 2011-07-06  
LZ再研究下信号量,发篇对比文章,偶在这等着欣赏哈...
 

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

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

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    在上面的例子中, CountDownLatch被用来模拟百米赛跑的场景,其中八名运动员同时起跑,由于速度的快慢,肯定会出现先到终点和晚到终点的情况,而终点有个统计成绩的仪器,当所有选手到达终点时,它会统计所有人的...

    利用 CountDownLatch 类实现线程同步

    在实际开发中,结合 `ExecutorService` 和 `Future`,我们可以构建更复杂的并发控制策略,以优化多线程程序的性能和可维护性。然而,也要注意,过度使用或不恰当使用同步工具可能导致死锁或性能下降,因此在设计并发...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在上述的百米赛跑例子中,CountDownLatch被巧妙地应用了。`CountDownLatch(int count)`构造函数接收一个初始计数值,表示需要等待的线程数量。每个线程完成任务后,调用`countDown()`方法使计数值减一,直到计数值减...

    CountDownLatch详解.docx

    这个例子展示了 CountDownLatch 如何帮助协调多线程间的同步。等待线程通过调用 `await()` 方法阻塞自己,直到所有工作线程完成它们的 `run()` 方法,调用 `countDown()`。一旦计数器达到0,所有等待的线程将被释放...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    CountDownLatch 是 Java 中一个强大的并发工具类,常用于线程间的协调与同步。它由 Java Concurrency Utilities (JCU) 包中的 `java.util....正确使用 CountDownLatch 可以提高程序的并发效率和线程间协作的准确性。

    Java并发包之CountDownLatch用法.docx

    在这个例子中,`CountDownLatchTest`的主方法创建了3个线程模拟3位乘客登机,`CountDownLatch`的计数器初始化为3。当所有乘客登机完成后,主线程会继续执行并宣布飞机起飞。 `CountDownLatch`在并行任务拆分和优化...

    Java中CountDownLatch用法解析

    在给出的代码示例中,`CountDownLatchDemo`类创建了两个`CountDownLatch`实例:`begin`和`end`。`begin`计数器的初始值为1,代表比赛开始的信号;`end`计数器的初始值为5,对应5位参赛运动员。在主方法中,首先创建...

    CountDownLatch同步工具类使用详解

    在上面的例子中,我们使用CountDownLatch来控制线程的执行顺序,使得主线程等待代表选手的线程执行完成后再执行。我们可以看到,通过CountDownLatch的使用,我们控制了线程的执行顺序。在上面的代码中,我们使用到...

    并发编程之Tools&CountDownLatch&Semaphore原理与应用1

    举个例子,假设我们有n个子线程需要完成任务,主线程可以使用CountDownLatch来等待所有子线程完成。当所有子线程调用`countDown()`后,主线程的`await()`方法将返回,表明所有子任务都已结束。 总结,Semaphore和...

    Java开发宝典的所有例子

    5. **多线程**:Java支持多线程编程,例子会介绍Thread类的使用、线程同步方法(如synchronized关键字、wait()、notify()等)以及并发工具类如Semaphore、CountDownLatch等。 6. **网络编程**:Java的Socket编程...

    JAVA例子100

    【JAVA例子100】这个资源对于初学者来说是一份宝贵的学习材料,它包含了100个不同的JAVA编程示例,旨在帮助新手更好地理解和掌握JAVA语言的基础与进阶概念。以下将详细介绍这些知识点: 1. **JAVA基础语法**:这...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    java100例,java的经典例子

    这100个例子可能包括了以上所有或部分知识点,通过实践每个例子,学习者能更好地理解Java语言的特性和用途,从而提升编程技能。在学习过程中,一定要注意阅读源码、理解代码逻辑,并尝试自己动手编写和修改,这是...

    java例子程序源代码

    线程和并发处理也是Java的强项,你可能会找到多线程创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait/notify、Lock接口)、并发工具类(如ExecutorService、Semaphore、CountDownLatch)的实例...

    Java线程并发工具类CountDownLatch原理及用法

    总结来说,CountDownLatch和CyclicBarrier都是Java并发编程中的重要工具,它们可以帮助开发者协调多线程间的同步行为。CountDownLatch更适合于一次性使用的场景,用于让一个线程等待其他线程完成特定操作,而...

    Java中多线程同步类 CountDownLatch

    以下是一个简单的使用CountDownLatch的例子: ```java import java.util.concurrent.CountDownLatch; public class TestThread extends Thread { CountDownLatch cd; String threadName; public TestThread...

    java线程并发countdownlatch类使用示例

    这个例子展示了`CountDownLatch`如何协调多个线程的执行顺序,确保在所有预设任务完成后,主任务才能继续执行。在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接...

    java多线程并发编程例子

    Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...

    zookeeper-watcher- 简单例子

    Apache ZooKeeper 是一个分布式协调服务,它为分布式应用程序提供了简化的命名服务、配置管理、集群管理和分布式同步等基础功能。在Zookeeper中,Watcher 是一个非常重要的特性,它允许客户端对Zookeeper中的数据...

Global site tag (gtag.js) - Google Analytics