模拟场景:
1.一个方法中如果需要调用多个服务,如果使用传统同步的方法会让用户等待太久。
2.这时,我们需要开多个线程来完成各种微服务得调用。这会大大降低用户等待的时间。
3.但是,如果这个方法还涉及到高并发的场景,会导致不断开线程,导致系统资源很容易撑爆得情况。
为解决以上场景出现的问题,使用线程池是比较有效的解决方案,以下介绍spring boot中配置线程池得简单配置如使用方案
1.在src/main/resources/application.properties 添加对应配置信息
gmall.pool.coreSize=8 #池的核心大小, gmall.pool.maximumPoolSize=100 #池的最大线程数, gmall.pool.queueSize=1000000 #池的队列长度,超出队列以外的请求拒绝
2.添加线程池配置文件 srcmainjava[XXX包]configThreadPoolConfig.java
/**
* 配置当前系统的线程池信息
*/
@Configuration
public class ThreadPoolConfig {
@Value("${gmall.pool.coreSize}")
private Integer coreSize;
@Value("${gmall.pool.maximumPoolSize}")
private Integer maximumPoolSize;
@Value("${gmall.pool.queueSize}")
private Integer queueSize;
//核心业务线程池
@Bean("mainThreadPoolExecutor")
public ThreadPoolExecutor mainThreadPoolExecutor(PoolProperties poolProperties){
/**
* public ThreadPoolExecutor(int corePoolSize,
* int maximumPoolSize,
* long keepAliveTime,
* TimeUnit unit,
* BlockingQueue<Runnable> workQueue,
* RejectedExecutionHandler handler) {
*/
LinkedBlockingDeque<Runnable> deque = new LinkedBlockingDeque<>(poolProperties.getQueueSize());
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(poolProperties.getCoreSize(),
poolProperties.getMaximumPoolSize(), 10,
TimeUnit.MINUTES, deque);
return threadPoolExecutor;
}
// 非核心业务线程池
@Bean("otherThreadPoolExecutor")
public ThreadPoolExecutor otherThreadPoolExecutor(PoolProperties poolProperties){
LinkedBlockingDeque<Runnable> deque = new LinkedBlockingDeque<>(poolProperties.getQueueSize());
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(poolProperties.getCoreSize(),
poolProperties.getMaximumPoolSize(), 10,
TimeUnit.MINUTES, deque);
return threadPoolExecutor;
}
}
3.在控制器中调用
@RestController
public class ProductItemController {
@Qualifier("mainThreadPoolExecutor")
@Autowired
ThreadPoolExecutor threadPoolExecutor;
@Qualifier("otherThreadPoolExecutor")
@Autowired
ThreadPoolExecutor otherThreadPoolExecutor;
/**
* 数据库(商品的基本信息表、商品的属性表、商品的促销表)和 es(info/attr/sale)
*
* 查加缓存
* 1、第一次查。肯定长。
* @return
*/
public EsProduct productInfo2(Long id){
CompletableFuture.supplyAsync(()->{
return "";
},threadPoolExecutor).whenComplete((r,e)->{
System.out.println("处理结果"+r);
System.out.println("处理异常"+e);
});
//1、商品基本数据(名字介绍等) 100ms 异步
//2、商品的属性数据 300ms
//3、商品的营销数据 SmsService 1s 500ms
//4、商品的配送数据 WuliuService 2s 700ms
//5、商品的增值服务数据 SaleService 1s 1s
//otherThreadPoolExecutor.submit()
return null;
}
}