格式
var aFuture = CompletableFuture.supplyAsync(()->{
//.....
return xxx;
});
var bFuture = CompletableFuture.supplyAsync(()->{
//.....
return xxx;
});
var cFuture = CompletableFuture.supplyAsync(()->{
//.....
return xxx;
});
//并行处理
CompletableFuture
.allOf(aFuture,
bFuture,
cFuture)
.join();
//取值
var a= aFuture.get();
var b= bFuture.get();
var c= cFuture.get();
在项目中的具体使用发法
//TODO 异步并行
@Override
public IndexBaseInfoVO getBaseInfo(String beginCreateTime, String endCreateTime) {
//1)构建一个空的结果集对象
IndexBaseInfoVO result = new IndexBaseInfoVO();
//2 封装结果集属性
// 2.1 由于查询需要用到用户名 调用工具类获取用户名
String username = SecurityUtils.getUsername();
try {
CompletableFuture<Integer> clueNums = CompletableFuture.supplyAsync(()->{
// 2.2 开始查询第一个属性 线索数量
return reportMpper.getCluesNum(beginCreateTime, endCreateTime, username);
});
CompletableFuture<Integer> bussinessNum = CompletableFuture.supplyAsync(()->{
// 2.3 开始查询第一个属性 商机数量
return reportMpper.getBusinessNum(beginCreateTime, endCreateTime, username);
});
CompletableFuture<Integer> contractNum = CompletableFuture.supplyAsync(()->{
// 2.4 开始查询第一个属性 合同数量
return reportMpper.getContractNum(beginCreateTime, endCreateTime, username);
});
CompletableFuture<Double> saleAmount = CompletableFuture.supplyAsync(()->{
// 2.5 开始查询第一个属性 销售金额数量
return reportMpper.getSalesAmount(beginCreateTime, endCreateTime, username);
});
//3 join等待所有线程全部执行完成
CompletableFuture
.allOf(clueNums,
bussinessNum,
contractNum,
saleAmount)
.join();
//4 封装结果集对象
result.setCluesNum(clueNums.get());
result.setBusinessNum(bussinessNum.get());
result.setContractNum(contractNum.get());
result.setSalesAmount(saleAmount.get());
}catch (Exception e) {
e.printStackTrace();
return null;
}
//4 返回结果集对象
return result;
}
格式的参数介绍
CompletableFuture<参数类型> 名字 = CompletableFuture.supplyAsync(()->{
return 你的参数
});
CompletableFuture<参数类型> 名字 = CompletableFuture.supplyAsync(()->{
return 你的参数
});
CompletableFuture<参数类型> 名字 = CompletableFuture.supplyAsync(()->{
return 你的参数
});
前面三个里面的 是一起运行的 不会从上到下运行
CompletableFuture
.allOf(前面的名字,
名字
)
.join();
join是等待所有线程全部执行完成
然后通过 名字.get 可以获得前面的返回的数据