前言:最近在工作中遇到这种情况,在一个接口中,需要调用多个方法,但是每个方法都是独立的,如果使用串行的方式来调用多个方法,会导致该接口的响应速度变慢,所以需要采用并行的方式来处理多个方法。
为了使用并行流来并行处理请求,可以将每个请求封装为一个Supplier
,然后使用Stream
的map
方法将这些Supplier
映射为结果集合,最后调用collect
方法收集结果。
以下是代码示例:
public LhzyStatRsp queryLhzyStat(LhzyStatReq stReq) {
LhzyStatRsp rsp = new LhzyStatRsp();
//创建请求的Supplier
Supplier<Map> queryLhzyOrgStatSupplier = () -> lhzyStatMapper.queryLhzyOrgStat();
Supplier<Map> queryLhzyCaptialStatSupplier = () -> lhzyStatMapper.queryLhzyCaptialStat();
Supplier<List<Map>> queryLhzyCaptailTop3Supplier = () -> lhzyStatMapper.queryLhzyCaptailTop3(limit);
Supplier<List<Map>> queryLhzyOrgTop3Supplier = () -> lhzyStatMapper.queryLhzyOrgTop3(limit);
Supplier<List<Map>> queryLhzyThemeTop3Supplier = () -> lhzyStatMapper.queryLhzyThemeTop3(limit);
//并行处理请求
List<CompletableFuture<?>> futures = Arrays.asList(
CompletableFuture.supplyAsync(queryLhzyOrgStatSupplier),
CompletableFuture.supplyAsync(queryLhzyCaptialStatSupplier),
CompletableFuture.supplyAsync(queryLhzyCaptailTop3Supplier),
CompletableFuture.supplyAsync(queryLhzyOrgTop3Supplier),
CompletableFuture.supplyAsync(queryLhzyThemeTop3Supplier)
);
//收集结果
List<Object> results = futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
Map queryLhzyOrgStat = (Map) results.get(0);
Map queryLhzyCaptialStat = (Map) results.get(1);
List<Map> queryLhzyCaptailTop3 = (List<Map>) results.get(2);
List<Map> queryLhzyOrgTop3 = (List<Map>) results.get(3);
List<Map> queryLhzyThemeTop3 = (List<Map>) results.get(4);
/*
* ..... 其他逻辑
*/
return rsp;
希望可以为遇到相同问题的朋友们,提供一下解决思路,欢迎在评论区一起交流。