异步实现商品详情页查询

 * 线程池 ExecutorService
 * 1、创建
 *   (1)public static ExecutorService service = Executors.newFixedThreadPool(10);
 *      (2)public ThreadPoolExecutor(int corePoolSize,核心线程数,一般默认不销毁
 *                               int maximumPoolSize,最大线程数  控制资源
 *                               long keepAliveTime,存活时间,
 *                               TimeUnit unit,时间单位
 *                               BlockingQueue<Runnable> workQueue,阻塞队列 多的任务放在队列里 一旦线程空闲 就会在队列里取任务
 *                               ThreadFactory threadFactory,  线程工厂
 *                               RejectedExecutionHandler handler)如果队列满了 按照指定的拒绝策略拒绝执行
 *                               new LinkedBlockingDeque<>(10)不指定10 默认为integer。Max
 *  2、工作流程
 *  (1)线程池创建准备好核心线程,准备接受任务
 *       如果core满了,在进入任务进入阻塞队列
 *       队列满了,开启新线程 到max
 *       max满了,有很多空闲,在指定的存活时间释放空闲线程
 *       如果没有空闲,执行拒绝策略
 *   3、常用线程池
Executors.newCachedThreadPool();//带缓存,core为0,都可回收
Executors.newFixedThreadPool(10);//固定大小,不可回收
Executors.newScheduledThreadPool(10);//定时任务
Executors.newSingleThreadExecutor();//单线程执行
* 4、线程池优点:
* 可以获得返回值,可以控制资源,性能稳定
* 降低资源消耗,提高响应速度,提高管理性
*  5、线程池的串行操作
* thenrun  runAfterBoth runAfterEither 不能接受上一步结果也无返回值
* thenaccept  acceptEither thenAcceptBoth能接受上一步结果但无返回值
* thenapply  thenCombineAsync applyToEither能接受上一步结果且有返回值
 1、想好业务逻辑循序,按照逻辑循序进行查询
2、等待所有业务方程后在返回
   public ItemVo getItem(Long skuId) {
        ItemVo skuItemVo = new ItemVo();
        CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
            //1、sku基本信息的获取  pms_sku_info
            SkuInfoEntity skuInfoEntity = this.getById(skuId);
            skuItemVo.setInfo(skuInfoEntity);
            return skuInfoEntity;
        }, executor);

        //2、sku的图片信息    pms_sku_images
        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
            List<SkuImagesEntity> skuImagesEntities = skuImagesService.list(new QueryWrapper<SkuImagesEntity>().eq("sku_id", skuId));
            skuItemVo.setImages(skuImagesEntities);
        }, executor);


        //3、获取spu的销售属性组合-> 依赖1 获取spuId
        CompletableFuture<Void> saleFuture = infoFuture.thenAcceptAsync((info) -> {
            List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.listSaleAttrs(info.getSpuId());
            skuItemVo.setSaleAttr(saleAttrVos);
        }, executor);


        //4、获取spu的介绍-> 依赖1 获取spuId
        CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((info) -> {
            SpuInfoDescEntity byId = spuInfoDescService.getById(info.getSpuId());
            skuItemVo.setDesc(byId);
        }, executor);


        //5、获取spu的规格参数信息-> 依赖1 获取spuId catalogId
        CompletableFuture<Void> attrFuture = infoFuture.thenAcceptAsync((info) -> {
            List<SpuItemAttrGroupVo> spuItemAttrGroupVos=productAttrValueService.getProductGroupAttrsBySpuId(info.getSpuId(), info.getCatalogId());
            skuItemVo.setGroupAttrs(spuItemAttrGroupVos);
        }, executor);

        //6、秒杀商品的优惠信息
//        CompletableFuture<Void> seckFuture = CompletableFuture.runAsync(() -> {
//            R r = seckillFeignService.getSeckillSkuInfo(skuId);
//            if (r.getCode() == 0) {
//                SeckillSkuVo seckillSkuVo = r.getData(new TypeReference<SeckillSkuVo>() {
//                });
//                long current = System.currentTimeMillis();
//                //如果返回结果不为空且活动未过期,设置秒杀信息
//                if (seckillSkuVo != null&&current<seckillSkuVo.getEndTime()) {
//                    skuItemVo.setSeckillSkuVo(seckillSkuVo);
//                }
//            }
//        }, executor);

//        等待所有任务执行完成
        try {
            CompletableFuture.allOf(imageFuture, saleFuture, descFuture, attrFuture).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return skuItemVo;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值