CompletableFuture

    @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;

 

posted @ 2023-08-22 15:30  一个有理想的猿  阅读(16)  评论(0编辑  收藏  举报