* 线程池 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&¤t<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;
}