一、ThreadPoolTaskExecutor线程池 有哪几个重要参数,什么时候会创建线程?
- 查看核心线程数是否已满,不满就创建一条线程执行任务,满了就执行第二条;
- 查看阻塞队列是否已满,不满就将任务存储在阻塞队列中,满了就执行第三条;
- 查看线程池是否已满,即是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照拒绝策略处理无法执行的任务;
二、高并发下核心线程怎么设置?
- 分IO密集型还是CPU密集型
- IO密集型
- 设置为2倍CPU核心数
- CPU密集型
- 设置为跟核心数一样大小
- IO密集型
说明:
-
IO密集型程序特点 :
- 高IO复杂度 :例如磁盘读写、网络传输等
- 较少的计算操作
- 较低的CPU占用率
-
CPU密集型程序特点 :
- 高计算复杂度 : 例如数据处理、图像处理、加密解密
- 较少的IO操作
- 较高的CPU占用率
三、ThreadPoolTaskExecutor自定义线程池
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig{
@Bean("threadPoolTaskExecutor")
public ThreadPoolTaskExecutor threadPoolTaskExecutor (){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor ();
//线程池创建的核心线程数 ,线程池维护线程的最少数量,即使没有任务执行,也会一直存活
executor.setCorePoolSize(8);
//超时是否关闭 默认是false , true时核心线程会超时关闭
//executor.setAllowCoreThreadTimeOut(false);
//阻塞队列 原来默认是2147483647 ,太大会造成OOM
executor.setQueueCapacity(124);
// 最大线程池数量 ,原来默认是2147483647,太大会造成OOM
executor.setMaxPoolSize(64);
// 允许线程空闲时间是30s , 当达到30s时,线程会退出,直到线程数量=CorePoolSize
executor.setKeepAliveSeconds(30);
executor.setThreadNamePrefix("自定义线程池");
// 拒绝策略 当线程池到达maxPoolSize时执行
// 默认策略:ThreadPoolExecutor.AbortPolicy 直接抛出异常
// ThreadPoolExecutor.CallerRunsPolicy:交由调用方线程运行
// ThreadPoolExecutor.DiscardPolicy: 丢弃当前被拒绝的任务(而不抛出任何异常)
// ThreadPoolExecutor.DiscardOldestPolicy: 将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.initialize();
return executor;
}
}