(计数器)CountDownLatch

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

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

  1. public class CountDownLatchExample {

  2.   // 循环次数

  3.  private static final int FOR_NUMBER = 5;



  4.   public static void main(String[] args) {


  5.       // 查询数据

  6.       for (int i = 0; i < FOR_NUMBER; i++) {

  7.           new Thread(() -> {

  8.               System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");

  9.          }, String.valueOf(i)).start();

  10.      }



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


  12.  }

  13. }

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

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

  1. public class CountDownLatchExample {

  2.   // 循环五次

  3.  private static final int FOR_NUMBER = 5;


  4.  // 实例化定义一个CountDownLatch需要减少的总次数

  5.  private static CountDownLatch countDownLatch = new CountDownLatch(5);



  6.   public static void main(String[] args) {


  7.       // 查询数据

  8.       for (int i = 0; i < FOR_NUMBER; i++) {

  9.           new Thread(() -> {

  10.               System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");


  11.               // 执行完 查询 然后进行递减操作 每次减1

  12.               countDownLatch.countDown();

  13.          }, String.valueOf(i)).start();

  14.      }


  15.       try {

  16.           countDownLatch.await(); // await()方法起到阻塞的作用,直到计数器值等于0

  17.      } catch (InterruptedException e) {

  18.           e.printStackTrace();

  19.      }



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


  21.  }

  22. }

多线程--CountDownLatch_java_02

突破实现:多线程--CountDownLatch_java_03

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

多线程--CountDownLatch_java_04

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

多线程--CountDownLatch_java_05

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

多线程--CountDownLatch_java_06

getCount方法:返回当前计数