首页 > 其他分享 >CompletableFuture

CompletableFuture

时间:2023-08-22 15:45:56浏览次数:45  
标签:查询 skuList item CompletableFuture id spuVO

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

 

标签:查询,skuList,item,CompletableFuture,id,spuVO
From: https://www.cnblogs.com/lly-rainbow/p/17648651.html

相关文章

  • Future和CompletableFuture区别
    Future:获取异步返回的结果需要使用轮询的方式,消耗cupExecutorServiceexecutorService=Executors.newFixedThreadPool(10);Future<String>future=executorService.submit(()->{try{Thread.sleep(2000);}......
  • CompletableFuture 批量办卡
    需求背景:每次传入需要办卡的订单的集合,根据每个办卡订单进行办卡操作。 技术要点:CompletableFuture:@AutowiredprivateThreadPoolTaskExecutorexecutor;方法:List<CompletableFuture>futures=Collections.synchronizedList(newArrayList<CompletableFuture>());  ......
  • java 用CompletableFuture来实现多线程查询和结果合并
    多线程查询结果合并使用CompletableFuture来实现多线程查询和结果合并。CompletableFuture提供了一种方便的方式来协调异步任务并处理其结果。下面是一个使用CompletableFuture的示例:importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CompletableF......
  • CompletableFuture 异步编排
      1.业务场景  查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。  假如商品详情页的每个查询,需要如下标注的时间才能完成,那么,用户需要5.5s后才能看到商品详情页的内容。很显然是不能接受的,如果有多个线程同时完成这6步操作,也许只需要......
  • CompletableFuture多任务组合回调
     1、AND组合关系thenCombine / thenAcceptBoth / runAfterBoth都表示:「当任务一和任务二都完成再执行任务三」。区别在于:「runAfterBoth」 不会把执行结果当做方法入参,且没有返回值「thenAcceptBoth」:会将两个任务的执行结果作为方法入参,传递到指定方法中,且无......
  • CompletableFuture异步多线程
    importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException{longstartTime=System.currentTimeMillis();//调用用户服......
  • CompletableFuture supplyAsync()
    CompletableFuture中的方法publicstaticCompletableFuture<Void>runAsync(Runnablerunnable)publicstaticCompletableFuture<Void>runAsync(Runnablerunnable,Executorexecutor)publicstatic<U>CompletableFuture<U>supplyAsync(Supplie......
  • Java8 高级功能CompletableFuture
    CompletableFuture功能测试CompletableFuture类实现了CompletionStage和Future接口。Future是Java5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用......
  • java-多线程并发,CompletableFuture
    //无返回值@OverridepublicvoidexecCreateYmDetDataSubTask(YmDetCreateWorkerDtoymDetCreateWorkerDto){List<Long>sendIdList=ymDetCreateWorkerDto.getSendIdList();List<List<Long>>subLists=Lists.partition(sendIdList,1......
  • 并发编程-CompletableFuture解析 | 京东物流技术团队
    1、CompletableFuture介绍CompletableFuture对象是JDK1.8版本新引入的类,这个类实现了两个接口,一个是Future接口,一个是CompletionStage接口。CompletionStage接口是JDK1.8版本提供的接口,用于异步执行中的阶段处理,CompletionStage定义了一组接口用于在一个阶段执行结束之后,要么继续执......