一. 线程池状态
线程池状态 | 说明 |
---|---|
RUNNING | 允许提交并处理任务 |
SHUTDOWN | 不允许提交新的任务,但是会处理完已提交的任务。 |
STOP | 不允许提交新的任务,也不会处理阻塞队列中未执行的任务,并设置正在执行的线程的中断标志位 |
TIDYING | 所有任务执行完毕,池中工作的线程数为0,等待执行terminated()勾子方法 |
TERMINATED | terminated()勾子方法执行完毕 |
线程池的shutdown() 方法,将线程池由 RUNNING(运行状态)转换为 SHUTDOWN状态
线程池的shutdownNow()方法,将线程池由RUNNING 或 SHUTDOWN 状态转换为 STOP 状态。
注:SHUTDOWN 状态 和 STOP 状态 先会转变为 TIDYING 状态,List item最终都会变为 TERMINATED
二、配置线程池
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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;
/**
* @Description: 线程池配置类
* @createTime: 2020-06-23 20:24
**/
@EnableConfigurationProperties(ThreadPoolConfigProperties.class) // 注入配置文件参数
@Configuration
public class MyThreadConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) {
return new ThreadPoolExecutor(
pool.getCoreSize(), // 最小线程数
pool.getMaxSize(), // 最大线程数
pool.getKeepAliveTime(), // 空闲线程关闭时间。
TimeUnit.SECONDS, // 关闭时间单位s
new LinkedBlockingDeque<>(100000), // 限制阻塞队列的长度10万
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒接策略
);
}
三、编写可配置类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @Description:
* @createTime: 2020-06-23 20:28
**/
@ConfigurationProperties(prefix = "gulimall.thread") // 绑定yml配置文件
// @Component
@Data
public class ThreadPoolConfigProperties {
// 最小线程数
private Integer coreSize;
// 最大线程数
private Integer maxSize;
// 空闲线程关闭时间
private Integer keepAliveTime;
}
四、application.properties配置文件
#配置线程池
gulimall.thread.coreSize=20
gulimall.thread.maxSize=200
gulimall.thread.keepAliveTime=10
五、业务层线程池使用
// 注入我们配置的线程池Bean.
@Resource
private ThreadPoolExecutor executor;
@Override
public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
// 有返回值的异步任务
CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
SkuInfoEntity info = this.getById(skuId);
skuItemVo.setInfo(info);
return info;
}, executor);
// 得到上一个异步任务结果,继续执行无返回值异步任务。
CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> {
List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());
skuItemVo.setSaleAttr(saleAttrVos);
}, executor);
// 等到所有任务都完成,.get()异步任务有异常,抛出异常。
CompletableFuture.allOf(infoFuture,saleAttrFuture,seckillFuture).get();
// 异步任务结束,返回结果。
return skuItemVo;
}
总结
.========================努力干吧!菜鸟。