JUC--CountDownLatch

简介: JUC--CountDownLatch

@[toc]

(计数器)CountDownLatch

CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

**countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。
存在于java.util.concurrent包下。**

public class CountDownLatchExample {
   // 循环次数
  private static final int FOR_NUMBER = 5;


   public static void main(String[] args) {

       // 查询数据
       for (int i = 0; i < FOR_NUMBER; i++) {
           new Thread(() -> {
               System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");
          }, String.valueOf(i)).start();
      }


       System.out.println("查询完毕");

  }
}

在这里插入图片描述
可以看到,还有数据没查询完成他就体检进行查询完毕的操作了。那如果在实际开发过程中,就等于数据还没处理完成就返回用户数据了。这并不是我们想要的结果。

那么刚才也有说CountDownLatch是阻塞一个或多个线程等待其他线程完成操作,那么我们试一下。

public class CountDownLatchExample {
   // 循环五次
  private static final int FOR_NUMBER = 5;

  // 实例化定义一个CountDownLatch需要减少的总次数
  private static CountDownLatch countDownLatch = new CountDownLatch(5);


   public static void main(String[] args) {

       // 查询数据
       for (int i = 0; i < FOR_NUMBER; i++) {
           new Thread(() -> {
               System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");

               // 执行完 查询 然后进行递减操作 每次减1
               countDownLatch.countDown();
          }, String.valueOf(i)).start();
      }

       try {
           countDownLatch.await(); // await()方法起到阻塞的作用,直到计数器值等于0
      } catch (InterruptedException e) {
           e.printStackTrace();
      }


       System.out.println("查询完毕");

  }
}

在这里插入图片描述

底层实现

在这里插入图片描述

有参构造 传的是int 类型数据

在这里插入图片描述

await方法 : await()方法起到阻塞的作用,直到计数器值等于0才能走下面逻辑

在这里插入图片描述

countDown 方法 :如果当前计数大于零,则将其递减。
*如果新计数为零,则所有等待线程都将重新启用
线程调度目的。 如果当前计数等于零,则不会发生任何事情。

在这里插入图片描述

getCount 方法 :返回当前计数

相关文章
|
6月前
|
设计模式 Java
CountDownLatch和CyclicBarrier源码详解
我现在有个场景:现在我有50个任务,这50个任务在完成之后,才能执行下一个函数,要是你,你怎么设计?可以用JDK给我们提供的线程工具类,CountDownLatch和CyclicBarrier都可以完成这个需求。基于AQS实现,会将构造CountDownLatch的入参传递至statecountDown()就是在利用CAS将state减1,await)实际就是让头节点一直在等待state为0时,释放所有等待的线程。
69 1
|
3月前
|
Java
JUC工具类: CountDownLatch详解
`CountDownLatch`是并发编程实践中的一个重要工具,它能简化多线程协调执行的复杂性,特别是在当一个操作需要等待一个或多个事件完成才能继续执行时。使用 `CountDownLatch`可以编写简洁的并行代码,确保在执行操作之前,所有的必要步骤都已经准备就绪。
34 1
|
6月前
|
Java
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
|
Java API
Java并发之CountDownLatch
Java并发之CountDownLatch
172 1
Java并发之CountDownLatch
|
安全 Java 调度
JUC并发编程学习(八)-CountDownLatch、CyclicBarrier、Semaphore的使用
JUC并发编程学习(八)-CountDownLatch、CyclicBarrier、Semaphore的使用
JUC并发编程学习(八)-CountDownLatch、CyclicBarrier、Semaphore的使用
JUC并发编程——CountDownLatch&Semaphore&CyclicBarrier
JUC并发编程——CountDownLatch&Semaphore&CyclicBarrier
151 0
JUC并发编程——CountDownLatch&Semaphore&CyclicBarrier
|
安全 Dubbo Java
JUC系列(七)| JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore
JUC系列(七)| JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore
465 0
JUC系列(七)| JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore
|
NoSQL Java Redis
【小家java】JUC并发编程工具之CountDownLatch(闭锁)、CyclicBarrier、Semaphore的使用(上)
【小家java】JUC并发编程工具之CountDownLatch(闭锁)、CyclicBarrier、Semaphore的使用(上)
【小家java】JUC并发编程工具之CountDownLatch(闭锁)、CyclicBarrier、Semaphore的使用(上)
|
安全
JUC CyclicBarrier和Semphore
JUC CyclicBarrier和Semphore
100 0
|
算法 Java 数据库
Java并发:同步工具类详解(CountDownLatch、CyclicBarrier、Semaphore)
Java并发:同步工具类详解(CountDownLatch、CyclicBarrier、Semaphore)
439 0