,Java高并发编程的三大基本工具之一,什么是CountDownLatchCountDownLatch是通过一个计数器实现的,计数器的初始值为线程数。每执行一个线程,计数器的值就减1,当计数器的值为0时,说明所有线程都执行完了,然后等待锁上的线程(调用await方法的线程)可以复工。应用场景CountDownLatch可以用来做什么?有哪些应用场景?在实际项目中有没有应用场景?这应该是每个人都关心的。我们先来看看官网提供的例子是如何应用的https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html官方提供了两个demo我直接put已经转换成图片了。顺便推荐一下这段代码转换图片的网址https://www.dute.org/code-snapshot,蛮好用的。官方网站demo1第一个是启动信号,在司机准备好让他们继续之前,阻止任何工人继续前进;第二个是完成信号,允许驱动程序等待所有工作人员完成。”第一个开始信号(startSignal)将阻止任何工人(worker)在司机到达之前开始工作。说白了,司机不来,工人就无法工作。第二个是完成信号(doneSignal),它允许驱动程序等待直到所有工人都完成。说白了就是司机要等到所有工人都做完了。官网demo2另一种典型的用法是将一个问题分成N个部分,用一个执行该部分的Runnable来描述每个部分并在latch上倒计时,并将所有Runnables排队到一个Executor。当所有子部分完成后,协调线程才能通过await。”另一个典型的用法是将一个大任务拆分成N个部分,让多个线程(Worker)执行,每个线程(Worker)执行自己的部分计数器减1即可,当所有子部分完成后,Driver会继续往下执行。就像富士康手机加工的流水线一样,一部手机的装配需要一系列的流水线配合每条流水线(Worker),每条线各司其职。有的线在贴膜,有的在拧螺丝,有的在质检,有的在充电,有的在贴膜。这些线都是干的时候大功告成,一部手机就组装完成了,上面两个是官方提供的demo,接下来说两个我们平时开发中可以用到的栗子:多线程等待:模拟并发,让并发线程一起执行。有时我们写了一个接口,想测试一下,看看它的最大并发数是多少。当然我们可以使用Jmeter进行压测,但是有时候不想下载工具,其实可以使用CountDownLatch来实现。/***@author:公众号:javafinance*/publicclassTestCountDownLatch1{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchcountDownLatch=newCountDownLatch(1);for(inti=0;i<5;i++){newThread(()->{try{//这里阻塞所有请求,等待countDownLatch.await();//调用测试接口System.out.println(Thread.currentThread().getName()+"开始执行...");}catch(InterruptedExceptione){e.printStackTrace();}}).start();}//让请求准备好Thread.sleep(2000);//让所有请求统一请求countDownLatch.countDown();}}我们使用CountDownLatch.await()让多个参与线程在启动后阻塞等待,然后在主线程调用CountDownLatch.countdown()将计数减为0,让所有线程一起执行;从而实现多个线程同时并发执行,模拟并发请求的目的。单线程等待:多线程(任务)完成后聚合合并count);for(inti=0;i
