CountDownLatch的使用

简介: CountDownLatch的使用

1.概述


CountDownLatch就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。

注意:java中还有一个同步工具类叫做CyclicBarrier,他的作用和CountDownLatch类似。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都必须要加载到100%才可以进入。否则所有玩家都相互等待。

我们看一下区别:

CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。 CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。关键点其实就在于那N个线程(1)CountDownLatch里面N个线程就是学生,学生做完了试卷就可以走了,不用等待其他的学生是否完成(2)CyclicBarrier 里面N个线程就是所有的游戏玩家,一个游戏玩家加载到100%还不可以,必须要等到其他的游戏玩家都加载到100%才可以开局


2.简单使用


//指定人数
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(){
            @Override
            public void run() {
                super.run();
                System.out.println("第一个人交卷");
                //countDownLatch的count减一
                countDownLatch.countDown();
            }
        }.start();
        try {
            //等待时间  如果countDownLatch的count=0 返回true 否则返回false 这里处于阻塞状态
            boolean await = countDownLatch.await(10, TimeUnit.SECONDS);
            System.out.println(await);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("考试结束");

运行结果

 

3.原理


CountDownLatch主要使用countDown方法进行减1操作,使用await方法进行等待操作

countDown

 

OK。到了这一步我们可能会纳闷,sync是个什么鬼,releaseShared方法又是如何实现的。我们不妨接着看源码

 

在这里我们发现继承了AbstractQueuedSynchronizer(AQS)。AQS的其中一个作用就是维护线程状态和获取释放锁。在这里也就是说CountDownLatch使用AQS机制维护锁状态。而releaseShared(1)方法就是释放了一个共享锁。

await原理

不带参数的await会一直等待,直到CountDownLatch的count为0,带参数的await最多等待指定时间退出,如果时间没到,CountDownLatch的count为0就立刻退出。如果CountDownLatch的count为0返回true,否则返回false。

 


目录
相关文章
|
4月前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
56 0
|
12月前
|
Java BI
CountDownLatch,CyclicBarrier,Semaphore
在开发过程中我们常常遇到需要对多个任务进行汇总,比如报表,或者大屏显示,需要将所有接口的数据都 获取到后再进行汇总,如果使用同步的方式,那么会比较耗时,体验不好,所以我们使用多线程,但是使用多线程 只能异步的执行,有些接口响应比较快,有些比较慢,而返回结果之间又有依赖,这样就无法汇总了, 所以我们引入了CountDownLatch,它能让所有子线程全部执行完毕后主线程才会往下执行,如果子线程没有执行完毕 ,那么主线程将无法继续向下执行。
55 0
|
4月前
CountDownLatch和CyclicBarrier你使用过吗?
CountDownLatch和CyclicBarrier你使用过吗?
36 0
CountDownLatch 使用详解
本文主要对CountDownLatch 的相关知识点进行了介绍和讲解
106 1
CountDownLatch&CyclicBarrier&Semaphore
本文将介绍一下CountDownLatch 、 CyclicBarrier 、 Semaphore这几个控制线程的类。
 CountDownLatch&CyclicBarrier&Semaphore
CountDownLatch
CountDownLatch是从JDK1.5开始提供的一个辅助并发编程的一个类,它位于在JUC包中。 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
130 0
|
Java
CountDownLatch:别浪,等人齐再团!(2)
CountDownLatch:别浪,等人齐再团!(2)
97 0
CountDownLatch:别浪,等人齐再团!(2)
CountDownLatch、CyclicBarrier的使用(门栓)
CountDownLatch、CyclicBarrier的使用(门栓)
98 0
|
消息中间件
CountDownLatch&CyclicBarrier
CountDownLatch&CyclicBarrier
130 0
CountDownLatch&CyclicBarrier