1.配置线程池
一般的应用整一个线程池就够了,有可能根据业务还是啥的整俩三个,这里我们整一个,直接bean注入使其可配置
package com.atguigu.gulimall.product.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author rengang
* @version 1.0
* @date 2021/4/20 15:00
*/
@Configuration
public class MyThreadConfig {
@Bean
public ThreadPoolExecutor myThreadPoolExecutor(ThreadPoolConfigProperties threadPoolConfigProperties){
return new ThreadPoolExecutor(threadPoolConfigProperties.getCoreSize(),threadPoolConfigProperties.getMaxSize(),threadPoolConfigProperties.getKeepAliveTime(),
TimeUnit.SECONDS,new LinkedBlockingDeque<>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
}
}
ThreadPoolConfigProperties 申明可配置属性 ,记得一定要加@Data注解,我刚开始没加配置文件的值就没设置进去
还有加@Component注解后,使用该注解对象的地方就能直接作为参数传入,就不需要加@EnableConfigurationProperties
package com.atguigu.gulimall.product.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author rengang
* @version 1.0
* @date 2021/4/20 15:14
*/
@ConfigurationProperties(prefix = "gulimall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {
private Integer coreSize;
private Integer maxSize;
private Integer keepAliveTime;
}
2.使用测试
SkuInfoServiceImpl
根据需求来异步编排,这里我的1,2步互不影响,然后3,4,5步必须要获取第一步的返回值后才能执行,然后方法需要在这5个任务都完成之后才返回值
@Autowired
ThreadPoolExecutor myThreadPoolExecutor;
@Override
public ItemVo queryItemById(Long skuId) throws ExecutionException, InterruptedException {
ItemVo itemVo = new ItemVo();
CompletableFuture<ItemVo> skuInfoFuture = CompletableFuture.supplyAsync(() -> {
//1.sku基本信息
SkuInfoEntity skuInfoEntity = getById(skuId);
itemVo.setInfo(skuInfoEntity);
return itemVo;
},myThreadPoolExecutor);
CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
//2.sku的图片信息
List<SkuImagesEntity> skuImagesEntitys = skuImagesService.getImagesBySkuId(skuId);
itemVo.setSkuImagesEntitys(skuImagesEntitys);
},myThreadPoolExecutor);
CompletableFuture<Void> saleAttrFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
//3.sku的销售属性
List<SkuItemSaleAttrVo> skuItemSaleAttrVos = skuSaleAttrValueService.getSaleAttrvaluesBySpuId(skuInfo.getInfo().getSpuId());
itemVo.setSkuItemSaleAttrVos(skuItemSaleAttrVos);
},myThreadPoolExecutor);
CompletableFuture<Void> descFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
//4.spu的介绍
SpuInfoDescEntity spuInfoDescEntity = SpuInfoDescService.getById(skuInfo.getInfo().getSpuId());
itemVo.setSpuInfoDescEntity(spuInfoDescEntity);
},myThreadPoolExecutor);
CompletableFuture<Void> groupAttrFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
//5.spu的规格参数信息(基本属性)
List<SpuItemAttrGroupVo> spuItemAttrGroupVos = attrGroupService.getAttrGroupWithAttrsByCatIdAndSpuId(skuInfo.getInfo().getSpuId(),
skuInfo.getInfo().getCatalogId());
},myThreadPoolExecutor);
CompletableFuture.allOf(imageFuture,saleAttrFuture,descFuture,groupAttrFuture).get();
return itemVo;
}