ThreadPoolTaskExecutor线程池面试题

文章讲述了ThreadPoolTaskExecutor线程池的关键参数,包括核心线程数、阻塞队列和最大线程池数,以及如何在高并发环境下针对IO密集型和CPU密集型任务进行合理设置。同时,文章提供了一个自定义线程池的配置示例,并讨论了不同的拒绝策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ThreadPoolTaskExecutor线程池 有哪几个重要参数,什么时候会创建线程?

  1. 查看核心线程数是否已满,不满就创建一条线程执行任务,满了就执行第二条;
  2. 查看阻塞队列是否已满,不满就将任务存储在阻塞队列中,满了就执行第三条;
  3. 查看线程池是否已满,即是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照拒绝策略处理无法执行的任务;

二、高并发下核心线程怎么设置?

  • 分IO密集型还是CPU密集型
    • IO密集型
      • 设置为2倍CPU核心数
    • CPU密集型
      • 设置为跟核心数一样大小

说明:

  • 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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值