countdownlatch是java多线程包concurrent里的一个常见工具类,通过使用它可以借助线程能力极大提升处理响应速度,且实现方式非常优雅。今天我们用一个实际案例和大家来讲解一下如何使用以及需要特别注意的点。
由于线程类的东西都比较抽象,我们换一种讲解思路,先讲解决问题的案例,然后再解释下原理。
假设在微服务架构中,A服务会调用B服务处理一些事情,且每处理一次业务,A可能要调用B多次处理逻辑相同但数据不同的事情。为了提升整个链路的处理速度,我们自然会想到是否可以把A调用B的各个请求组成一个批次,这样A服务只需要调用B服务一次,等B服务处理完一起返回即可,省了多次网络传输的时间。代码如下:
1 /** 2 * 批次请求处理服务 3 * @param batchRequests 批次请求对象列表 4 * @return 5 */ 6 public List<DealResult> deal(List<DealRequest> batchRequests){ 7 List<DealResult> resultList = new ArrayList<>(); 8 if(batchRequests != null){ 9 for(DealRequest request : batchRequests){ 10 //遍历顺序处理单个请求 11 resultList.add(process(request)); 12 } 13 } 14 return resultList; 15 }