Spring线程池的配置及使用ThreadPoolTaskExecutor过程

 更新时间:2026年03月30日 11:03:23   作者:Jason_520168  
本文主要介绍了Spring提供的线程池ThreadPoolTaskExecutor及其配置方式,以及FixedThreadPool线程池的使用注意事项,同时强调了计数器的使用可以保证线程池执行顺序

一、ThreadPoolTaskExecutor是什么?

ThreadPoolTaskExecutor是Spring提供的线程池,通过配置参数初始化线程池,随取随用,不需要操作线程的创建和销毁。

二、代码实现

1.配置类ExecutorConfig

代码如下(示例):

@Configuration
@EnableAsync
public class ExecutorConfig {

    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    private int corePoolSize = 5;
    private int maxPoolSize = 10;
    private int queueCapacity = 99999;
    private String namePrefix = "async-service-";

    @Bean(name = "asyncServiceExecutor")
    public ThreadPoolTaskExecutor asyncServiceExecutor(){
        logger.info("start asyncServiceExecutor");
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(corePoolSize);
        //配置最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        //配置队列大小
        executor.setQueueCapacity(queueCapacity);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix(namePrefix);

        // rejection-policy: 当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS: 不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}

2.引入使用

代码如下(示例):

    @Resource(name = "asyncServiceExecutor")
    private ThreadPoolTaskExecutor executor;

	//定义计数器
	final CountDownLatch countDownLatch=new CountDownLatch(list.size());
	executor.execute(()-> {
                    try {
						//Do something
                    } catch (Exception e) {
                        log.error(e.getMessage());
                    } finally {
                        log.info(Thread.currentThread().getName() + "执行完成");
                        //计数器减一
                        countDownLatch.countDown();
                    }
                });

            try {
                countDownLatch.await();
                executor.shutdownNow();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //Do something

三、FixedThreadPool线程池

我们在开发中经常会用到Java提供的工具类创建线程池,FixedThreadPool就是其中之一,但在使用中要注意这个线程池一旦开启会引起内存飙升的问题,下面我们来看下源码。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
//定义计数器
	final CountDownLatch countDownLatch=new CountDownLatch(list.size());
	fixedThreadPool.execute(()-> {
                    try {
						//Do something
                    } catch (Exception e) {
                        log.error(e.getMessage());
                    } finally {
                        log.info(Thread.currentThread().getName() + "执行完成");
                        //计数器减一
                        countDownLatch.countDown();
                    }
                });

            try {
                countDownLatch.await();
                fixedThreadPool.shutdownNow();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //Do something


上面两图是截图出来的源码,重点就在这个new出来的队列,通常称为无界队列,因为这个队列默认大小是Interger.MAX_VALUE,所以在线程池创建的一瞬间内存就会飙升,直到所有线程执行完毕,关闭线程池,才会释放内存

总结

注意:

  • 计数器的定义是为了保证:线程池全部执行完for循环中的内容,再执行后续的内容。
  • 如果不需要保证执行顺序,可以不使用计数器。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis在sqlite中无法读写byte[]类问题的解决办法

    Mybatis在sqlite中无法读写byte[]类问题的解决办法

    这篇文章主要给大家介绍了关于Mybatis在sqlite中无法读写byte[]类问题的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java 装箱与拆箱详解及实例代码

    Java 装箱与拆箱详解及实例代码

    这篇文章主要介绍了Java 装箱与拆箱详解及实例代码的相关资料,这里对java 的装箱及拆箱进行了基本概念详解及简单使用,需要的朋友可以参考下
    2017-01-01
  • HashMap插入相同key问题

    HashMap插入相同key问题

    这篇文章主要介绍了HashMap插入相同key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • MyBatis-Plus 中 的动态SQL 片段(sqlSegment)详解

    MyBatis-Plus 中 的动态SQL 片段(sqlSegment)详解

    MyBatis-Plus的sqlSegment通过Wrapper动态生成SQL片段,支持XML中${ew.customSqlSegment}引用,结合Lambda表达式避免硬编码,适用于动态查询、逻辑删除等场景,提升代码可维护性与灵活性,本文给大家介绍MyBatis-Plus中的动态SQL片段(sqlSegment)讲解,感兴趣的朋友一起看看吧
    2025-06-06
  • MyBatis-Plus常见面试题和答案大全

    MyBatis-Plus常见面试题和答案大全

    Mybatis-Plus是一个基于Mybatis的增强工具,它简化了Mybatis的开发流程,提供了许多实用的功能,如自动生成代码、分页查询、条件构造器、性能分析等,这篇文章主要给大家介绍了关于MyBatis-Plus常见面试题和答案的相关资料,需要的朋友可以参考下
    2023-06-06
  • Java雇员管理小项目

    Java雇员管理小项目

    这篇文章主要为大家详细介绍了Java雇员管理小项目,理解面向对象编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Windows下apache ant安装、环境变量配置教程

    Windows下apache ant安装、环境变量配置教程

    这篇文章主要介绍了Windows下apache ant安装、环境变量配置教程,ANT的安装很简单,本文同时讲解了验证安装是否成功的方法和使用方法实例,需要的朋友可以参考下
    2015-06-06
  • 使用java.util.Timer实现任务调度

    使用java.util.Timer实现任务调度

    这篇文章主要为大家详细介绍了使用java.util.Timer实现任务调度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • springboot+camunda实现工作流的流程分析

    springboot+camunda实现工作流的流程分析

    Camunda是基于Java语言,支持BPMN标准的工作流和流程自动化框架,并且还支持CMMN规范,DMN规范,本文给大家介绍springboot+camunda实现工作流的流程分析,感兴趣的朋友一起看看吧
    2021-12-12
  • SpringBoot 单元测试JUnit的使用详解

    SpringBoot 单元测试JUnit的使用详解

    这篇文章主要介绍了SpringBoot 单元测试JUnit的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论