一、在application.properties文件中添加如下配置信息
项目结构:
#配置自定义的线程池
gulimall.thread.core-size=20
#这里可以设置成本地的cpu核数
#gulimall.thread.max-size=200
gulimall.thread.keep-alive-time=10
二、创建一个属性绑定类
//跟配置文件绑定
@ConfigurationProperties(prefix = "gulimall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {
private Integer coreSize;
private Integer maxSize;
private Integer keepAliveTime;
}
三、创建一个配置类,将属性里的值传递到线程池中
//开启属性配置(因为ThreadPoolConfigProperties写了@Component,已经注入到容器中了,所以就不用写了)
//@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {
//ThreadPoolConfigProperties是从spring容器中取出来的值
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) {
return new ThreadPoolExecutor(pool.getCoreSize(),
Runtime.getRuntime().availableProcessors(),//设置成cpu的核数
pool.getKeepAliveTime(), TimeUnit.SECONDS,
new LinkedBlockingDeque<>(100000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}
}
由于在ThreadPoolConfigProperties中已经使用@Component将对象交给spring容器俩进行管理。那么这里的方法中就可以直接从spring容器中获取绑定的值。
实际例子:
@Service("skuInfoService")
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoDao, SkuInfoEntity> implements SkuInfoService {
//注入线程池
@Autowired
ThreadPoolExecutor executor;
/**
* 本方法需要异步编排处理
* 1 2 没关系 查谁都行
* 3 4 5 必须依赖 1(1 -> 3、4、5)
* 3 4 5 是并列的,得等 1 完成
* 2 又和 1 没关系
*/
@Override
public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
//要返回给前端的大对象
SkuItemVo skuItemVo = new SkuItemVo();
CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
//1 sku基本信息获取 pms_sku_info
SkuInfoEntity info = getById(skuId);
skuItemVo.setInfo(info);
return info;
}, executor);
CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((result) -> {
//3 spu的销售属性组合
Long spuId = result.getSpuId();
List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrBySpuId(spuId);
skuItemVo.setSaleAttr(saleAttrVos);
}, executor);
CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((result) -> {
//4 spu的介绍 pms_spu_info_desc
Long spuId = result.getSpuId();
SpuInfoDescEntity desc = spuInfoDescService.getById(spuId);
skuItemVo.setDesc(desc);
}, executor);
CompletableFuture<Void> baseFuture = infoFuture.thenAcceptAsync((result) -> {
//5 spu的规格参数信息
Long spuId = result.getSpuId();
Long catalogId = result.getCatalogId();
List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(spuId, catalogId);
skuItemVo.setGroupAttrs(attrGroupVos);
}, executor);
CompletableFuture<Void> imagesFuture = CompletableFuture.runAsync(() -> {
//2 sku图片信息 pms_sku_images
List<SkuImagesEntity> images = skuImagesService.getImagesBySkuId(skuId);
skuItemVo.setImages(images);
}, executor);
//异步编排 - 阻塞等结果
//等待所有1 2 3 4 5任务都完成 infoFuture可以省略
CompletableFuture.allOf(saleAttrFuture, descFuture, baseFuture, imagesFuture).get();
return skuItemVo;
}
}