`
airu
  • 浏览: 270754 次
  • 性别: 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;
        }
    }

分享到:
评论

相关推荐

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作...理解其工作原理和应用场景,能帮助开发者更好地设计和优化并发程序。

    利用 CountDownLatch 类实现线程同步

    首先,让我们深入理解 `CountDownLatch` 的工作原理。`CountDownLatch` 在构造时会接收一个整数值作为计数器的初始值。这个计数器只能递减,不能递增。每当一个线程完成其任务后,它会调用 `countDown()` 方法,使...

    CountDownLatch和CyclicBarrier用法实例大全

    学习和理解这两个工具,对于提升Java并发编程的能力至关重要,它们能帮助我们编写出更加高效、可维护的并发代码。通过阅读《java并发编程》中的实例,你可以更深入地掌握这些概念,并在实际工作中灵活运用。

    CountDownLatch练习

    CountDownLatch是Java并发编程中一个重要的同步工具类,它允许一个或多个线程等待其他线程完成操作。...通过阅读和理解提供的代码样例(如`countdownlatch`文件),可以进一步加深对CountDownLatch的理解和应用。

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    CountDownLatch Demo

    在这个"CountDownLatch Demo"中,我们将深入理解 CountDownLatch 的原理、用法以及如何在实际项目中应用。 CountDownLatch 的核心概念在于一个计数器(count),初始化时设置为一个非负整数。这个计数器通过 `...

    countdownlatch-example-sourcecode.zip

    通过对`countdownlatch-example-sourcecode.zip`中的代码学习,我们可以更深入地理解CountDownLatch的工作机制,将其有效地应用于实际的并发编程中。同时,掌握好CountDownLatch和其他并发工具类,能够帮助我们编写...

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    CountDownLatch是Java并发编程中一个...理解其工作原理和使用方法对于编写高效的并发程序至关重要。在实际编程中,应根据具体需求选择CountDownLatch或CyclicBarrier,以及其他并发工具,以确保程序的正确性和性能。

    Java中CountDownLatch用法解析

    在Java并发编程中,`CountDownLatch`是一个非常重要的工具类,它位于`java.util.concurrent`包下,用于协调多个线程间的同步。...理解和熟练使用`CountDownLatch`对于编写高效的多线程Java程序至关重要。

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

    1. **理解 CountDownLatch** CountDownLatch 的名字来源于其工作原理,就像倒数计时一样,从一个初始设定的计数值开始,每当一个线程完成其任务,计数值就会减一。当计数值为零时,意味着所有线程都已经完成了它们...

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

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent...理解并熟练运用这两种工具,可以极大地提高多线程程序的效率和可维护性。

    并发控制艺术:掌握CountDownLatch与Semaphore

    在这个领域,理解并正确使用同步工具,如CountDownLatch和Semaphore,是至关重要的。Semaphore(信号量)是一种广泛应用于控制对特定资源的线程访问数的工具。它基于许可的概念,允许多个线程在限制下同时访问资源,...

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

    在深入理解这些工具的同时,学习AQS是必要的,因为它是Java并发库的基础,许多高级同步组件如ReentrantLock、Semaphore、CountDownLatch等都基于AQS实现。AQS通过维护一个共享状态(state)来控制同步,提供了`...

    源码详解CountDownLatch

    CountDownLatch 是 Java 中一个强大的并发工具,用于协调多个线程之间的同步。它是 java.util.concurrent 包中的一个类,主要用于在多线程...理解 CountDownLatch 的工作原理有助于我们更有效地设计和优化多线程程序。

    java利用CountDownLatch实现并行计算

    Java 利用 CountDownLatch 实现并行计算 Java 中的并行计算是一个非常重要的概念,为了提高计算速度和效率,Java 提供了一些工具和类来实现并行...hope 本文能够帮助读者更好地理解并行计算和 CountDownLatch 的使用。

    java线程并发countdownlatch类使用示例

    Java中的`CountDownLatch`是线程并发控制的一个重要工具,它允许一组线程等待其他...通过以上解释和示例,你应该对Java中的`CountDownLatch`有了深入的理解,可以将其运用到实际的并发编程中,解决线程间的协调问题。

    浅谈java并发之计数器CountDownLatch

    CountDownLatch是Java并发编程中一个重要的工具类,用于协调多个线程间的同步。它通过一个计数器来控制线程的执行流程,使得一个或多个线程等待...正确理解和使用CountDownLatch能够提高程序的效率和并发控制的精确性。

    Java中多线程同步类 CountDownLatch

    Java中的CountDownLatch是一种多线程同步工具类,它在并发编程中扮演着重要角色,尤其在需要等待一组任务完成后再进行下一步操作的场景下。...正确理解和使用它可以帮助开发者编写出更加高效、可靠的多线程程序。

    CountDownLatch源码解析之countDown()

    CountDownLatch源码解析之countDown()方法详解 ...通过对tryReleaseShared()方法和doReleaseShared()方法的实现原理的分析,我们可以更好地理解CountDownLatch的工作机制,并更好地应用于实际开发中。

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

    本篇文章主要介绍了Java中的CountDownLatch类,作为Java并发编程专题(八)的一部分,通过实例讲解帮助读者理解和学习。下面是文章中的知识点总结: 一、CountDownLatch简介 CountDownLatch是一个同步辅助类,允许...

Global site tag (gtag.js) - Google Analytics