一、简介CountDownLatch
多线程开发经常出现的情况:开启一定数量的子线程执行批量任务,主线程后续的操作依赖于子线程执行产生的结果,这种情况就需要主线程等待子线程执行完毕,然后主线程默认与子线程异步,此时就需要使用到线程同步工具类了
thread.join()可以保证在当前线程执行结束前为主线程加锁,但jdk1.5出现java.util.concurrent出现后,线程池中的线程不能被直接引用了,这里使用java.util.concurrent.CountDownLatch也更加方便。
二、CountDownLatch使用的场景可以说特别多,举个我们应用中使用的场景:
后台订单列表加载搜索时,多线程根据id加载订单的所有相关属性,每个线程处理500个订单,处理订单后需要封装返回前台,所以需要等待所有订单加载完成后才能封装返回前台的对象,这个时候根据我们创建的订单数来初始化CountDownLatch
CountDownLatch latch = new CountDownLatch(threadCount);
创建线程时传入并且最终执行countDown方法减1,知道最终减为0,才会放行主线程
依赖于
latch.await();
三、其他情况,如果我们初始化的CountDownLatch(threadCount) threadCount数量大于当前子线程数量最终没有减到0,那么 latch.await() 便会一直处于等待状态。