首页 > 其他 > 详细

CountDownLatch类

时间:2020-12-22 17:30:39      阅读:37      评论:0      收藏:0      [点我收藏+]

1.简述                                                   

  CountDownLatch是Java1.5之后引入的Java并发工具类(闭锁的一个实现),放在java.util.concurrent包下。用给定的计数初始化CountDownLatch。由于调用了countDown方法,所以在当前计数到达零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,await的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier。

  CountDownLatch能够使一个或多个线程等待其他线程完成各自的工作后再执行。

  闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。

  其他的N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务,这种机制就是通过countDown()方法来完成的。

  CountDownLatch优点

  • 对使用者而言,你只需要传入一个int型变量控制任务数量即可,至于同步队列的出队入队维护,state变量值的维护对使用者都是透明的,使用方便。

  CountDownLatch缺点

  • CountDownLatch设置了state后就不能更改,也不能循环使用。

  CountDownLatch使用场景

  • 适用于一个任务的执行需要等待其他任务执行完毕,方可执行的场景。

2.CountDownLatch主要方法                                         

  CountDownLatch的主要方法

  • getCount():获取当前count的值。
  • wait():让当前线程在此CountDownLatch对象上等待,可以中断。与notify()、notifyAll()方法对应。
  • await():让当前线程等待此CountDownLatch对象的count变为0,可以中断。
  • await(timeout,TimeUnit):让当前线程等待此CountDownLatch对象的count变为0,可以超时、可以中断。
  • countDown():使此CountDownLatch对象的count值减1(无论执行多少次,count最小值为0)。

  注意

  • wait()方法是从Object类继承来的。
  • 无论执行多少次countDown()方法,count最小值为0,不会变成负数。

3.CountDownLatch使用                                           

  CountDownLatch的使用示例

技术分享图片
public class Test {
    public static void main(String[] args) throws Exception {
        /*创建CountDownLatch实例,计数器的值初始化为5*/
        final CountDownLatch downLatch = new CountDownLatch(5);
        /*创建三个线程,每个线程等待2s,表示执行比较耗时的任务*/
        for(int i = 0;i < 5;i++){
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(2000);
                        System.out.println(String.format("线程%s已完成", Thread.currentThread().getName()));
                        /*任务完成后调用CountDownLatch的countDown()方法,进行减1*/
                        downLatch.countDown();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        /*主线程调用await()方法,等到其他五个线程执行完后才继续执行*/
        downLatch.await();
        System.out.print("所有线程都已经执行完成,继续运行主线程逻辑");
    }
}
View Code

4.总结                                                   

  CountDownLatch方法总结

  • await():等待count减少至0,或者被中断。
  • await(timeout,timeUnit):等待count减少至0,或者超时,或者被中断。
  • countDown():count值减1。

CountDownLatch类

原文:https://www.cnblogs.com/bl123/p/14166734.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!