`
airu
  • 浏览: 267306 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

CountDownLatch 理解

 
阅读更多
Latch 在英文中是门阀的意思。也就是控制门的开关的关键。
所以,Latch在并发中,就是控制线程访问的。《JCP》中列举了几点用途:
1,等待资源初始化。
2,等待依赖服务启动。
3,等待队友加入活动。

具体的Latch有 CountDownLatch,如果只是说功能什么的,还是比较疑惑。
CountDownLatch 的功能就是初始化一个值,每次调用countDown方法时这个值就减 1
注意初始化的值应该是正的,否則Throws:
IllegalArgumentException - if count is negative),而 await方法就是阻塞线程,直到这个值减为0
这个有什么用呢?

书上给出的例子很好,就是计算多个线程运行消耗的时间。这里我们要注意,如何判断开始和结束呢? 因为多线程中,很可能有的线程启动快,你得选取一个计时点。如果从添加任务开始,那么明显不准缺,添加本身的时间也算上了,所以必须有个时间点,在此之前所有线程都必须等待。于是CountDownLatch变成了发令枪,一声枪响,所有线程就可以狂奔了。
同样结束也是要等待最后一个线程完成。所以也可以用CountDownLatch作为计数员。
这下,我把这个例子变成跑步比赛了。书中的例子好比记录比赛的时间。
运动员就是任务,跑步就是他们的任务,每条跑道就是一个线程。第一个阀门就是发令枪,
在此之前运动员都只是在跑道上等着。第二个阀门则是控制裁判员的,必须等到最后一个运动员跑完才计时结束。
接下来直接看代码:
import java.util.concurrent.CountDownLatch;

public class CompetitionTime {
    public long getCompetitionTime( int nAthlete, final Runnable Athlete ) 
         throws InterruptedException {
        // the starting gun just shot once.
        final CountDownLatch startingGun = new CountDownLatch( 1 );
        // every athlete should complete the competition.
        final CountDownLatch endCompetition = new CountDownLatch( nAthlete );

        for ( int i = 0; i < nAthlete; i++ ) {
            Thread t = new Thread() {
                public void run() {
                    try {
                        //before running, athlete must wait for shot of the starting gun 
                        startingGun.await();
                        try {
                            Athlete.run();
                        }
                        finally {
                            //when he finishes his competition,let the referee know
                            endCompetition.countDown();
                        }
                    }
                    catch ( InterruptedException ignored ) {

                    }
                }
            } ;
            t.start();
          //now the thread must wait for the shot of the starting gun
        }
            
            //the following two can exchange the order. 
            long start = System.nanoTime();
            startingGun.countDown();
            //then we just wait for the last athlete done.
            // the main thread is blocking.
            endCompetition.await();
            // that means all athlete finish their competition.
            long end = System.nanoTime();
            return end - start;
        }
    }

分享到:
评论

相关推荐

    java并发编程专题(八)----(JUC)实例讲解CountDownLatch

    主要介绍了java CountDownLatch的相关资料,文中示例代码非常详细,帮助大家理解和学习,感兴趣的朋友可以了解下

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 ...25.大白话说java并发工具类-CountDownLatch,CyclicBarrier 26.大白话说java并发工具类-Semaphore,Exchanger 27.一篇文章,让你彻底弄懂生产者--消费者问题

    从零基础到深入理解,教你高并发(4.3G)

    01-并发简史.avi 02-线程和进程.avi 03-创建线程的方式(1).avi 04-线程池.avi 05-forkjoin.avi 06-JVM的内存模型.avi 07-volatile.avi 08-多线程的风险.avi 09-CAS.avi 10-线程的状态.avi ...14-countDownLatch.avi

    2023年最新Java高并发多线程面试题

    内容概要:最新2023年Java高并发多线程后端面试题整理, 包含线程池,并发集合,volatile,CountDownLatch,Semaphore,Phaser,AQS,ReentrantLock,ReentrantLock等等问题, 用简洁明了的语言,通俗易懂地阐述了高...

    Java并发编程原理与实战

    理解自旋锁,死锁与重入锁.mp4 深入理解volatile原理与使用.mp4 JDK5提供的原子类的操作以及实现原理.mp4 Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写...

    Java并发编程基础.pdf

    线程与线程状态:理解Java中线程的基本概念,包括线程的创建、启动、暂停、恢复和终止。熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步与通信:掌握Java中的同步机制,如synchronized...

    XML文件_xml

    具备扎实的Java基础,熟练掌握集合,AQS,Synchronized关键字,CountDownLatch&Semaphore应用与原理,Executor线程池原理与源码,深入理解同步器AQS阻塞队列BlockingQueue,Future&ForkJoin框架原理,无锁并发框架...

    龙果 java并发编程原理实战

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段18讲 CountDownLatch经典案例讲解如何给离散平行任务增加逻辑层次关系-下_.mp4  高并发编程第三阶段19讲 CyclicBarrier工具的使用场景介绍_.mp4  高并发编程第三阶段20讲 CyclicBarrier vs ...

    Java 并发编程原理与实战视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    龙果java并发编程完整视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    java并发编程

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】java多态的理解 13 【基础】transient关键字 15 【基础】访问修饰符区别 15 【基础】java基本数据类型(四类八种) 15 Java自动类型转换 16 数据类型自动提升(注意以下讨论的是二元操作符) 16 【基础】...

Global site tag (gtag.js) - Google Analytics