@SneakyThrows
@Override
public SpuVO queryDetail(Long id) {
//1.查询spu
SpuVO spuVO = spuMapper.queryInfoById(id);
if(spuVO == null){
//是否存在此商品
throw new MallException("商品已删除");
}
//runAsync 异步执行任务 无返回值
//supplyAsync 异步执行任务 有返回值
//thenAccept(同步) thenAcceptAsync(异步) 消费上一步的结果 无返回值
//thenApply(同步) thenApplyAsync(异步)消费上一步的结果 有返回值
//thenRun 执行一个新的任务 无消费 无返回值
CompletableFuture<Void> spuAttrFuture = CompletableFuture.runAsync(() -> {
//2.查询基本属性列表
List<SpuAttrValueVO> spuAttrList = spuAttrValueService.queryAttrListBySpuId(id);
//跟据SpuId查询Spu属性
spuVO.setSpuAttrList(spuAttrList);
//封装SpuVO
},mallExecutor);
CompletableFuture<Void> spuImgFuture = CompletableFuture.runAsync(() -> {
//3.查询图片列表
List<String> spuImages = spuMapper.queryImagesBySpuId(id);
spuVO.setImageList(spuImages);
//查询Spu图片并进行封装
},mallExecutor);
CompletableFuture<Void> skuFuture = CompletableFuture.supplyAsync(() -> {
//4.查询sku列表
List<SkuVO> skuList = skuService.queryListBySpuId(id);
spuVO.setSkuList(skuList);
//查询Sku并封装,返回
return skuList;
//thenAccept 消费上一步的结果
},mallExecutor).thenAcceptAsync((skuList) -> {
//消费封装的Sku
skuList.forEach(item -> {
//5.查询sku销售属性列表
List<SkuAttrValueVO> skuAttrValueList = skuAttrValueService.queryListBySkuId(item.getSkuId());
item.setSkuAttrList(skuAttrValueList);
//向每一个Sku中添加自己的属性
//6.查询sku图片列表
List<String> skuImages = skuService.queryImagesBySkuId(item.getSkuId());
item.setImageList(skuImages);
//向每一个Sku中添加图片
});
},mallExecutor);
//allOf等待所有任务完成
//anyOf等待任意一个任务完成
//get阻塞等待结果
CompletableFuture.allOf(spuAttrFuture,spuImgFuture,skuFuture).get();
//等待指定线程执行完毕,
return spuVO;