目录
一,概念
CountDownLatch 的作用就是允许
一个或者多个线程在开始执行操作之前,必须要等到其他线程执行完成。
例如:生活中我们打王者要五个人都进入房间才能选英雄,工作上我们有循环调用接口的案例,要等循环调用结束拿到所有的数据之后才能进行下一步操作
二,方法
方法 | 说明 |
await() |
使当前线程进入同步队列进行等待,直到
的值被减到
或者当前线程被中断,当前线程就会被唤醒。 |
await(long timeout, TimeUnit unit) |
带超时时间的
。 |
countDown() |
使
的值减
,如果减到了
,则会唤醒所有等待在这个
上的线程。 |
getCount() |
获得
的数值。 |
三,使用测试
package com.example.demo.test.suanfa;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.*;
/**
* @author qiankun.hu
* @version 1.0.0
* @createTime 2022年09月10日 16:51:00
* @Description TODO
*/
public class CountDownLatchTest {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,60,
TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(10),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
Map<Object, Object> map = new HashMap<>();
Integer poolNumber = 5;
long start = System.currentTimeMillis();
//初始化会运行的线程数 这里测试固定为 5 个线程,一定要和下面的 i 循环的变量相同
CountDownLatch countDownLatch = new CountDownLatch( poolNumber );
for (int i = 1; i <= poolNumber ; i++) {
Integer time = i * 1000;
threadPoolExecutor.execute(()->{
try {
System.out.println("time:"+time);
//模拟接口调用耗时
Thread.sleep( time );
//比如这里拿到每一次接口调用返回的结果
map.put(time,time);
}catch (Exception e){
//异常信息
}finally {
//线程计数器-1
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println("总耗时:"+ (System.currentTimeMillis() - start) +" ms");
//拿到所有的结果,然后往下处理
System.out.println("map数量:"+map.size());
threadPoolExecutor.shutdown();
}
}
在上面,我们定义了一个CountDownLatch,并设置其值为 5 ,这里我们模拟循环五次多线程异步调用接口,模拟调用耗时,最后等五次调用全部结束,才能执行下一步操作,如果是普调循环调用接口,则最大耗时为: 1+2+3+4+5 = 15秒,而使用多线程+CountDownLatch,我们5秒左右就可以完成,接下来我们看一下测试结果
通过输出结果可以看到,总耗时缩短了近1/3,最大程度上优化了代码的执行速度
版权声明:本文为huqiankunlol原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。