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循环中的内容,再执行后续的内容。
  • 如果不需要保证执行顺序,可以不使用计数器。

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

相关文章

  • Java编程使用箱式布局管理器示例【基于swing组件】

    Java编程使用箱式布局管理器示例【基于swing组件】

    这篇文章主要介绍了Java编程使用箱式布局管理器,结合实例形式分析了基于swing组件的箱式布局管理器定义与使用技巧,需要的朋友可以参考下
    2018-01-01
  • spring解决循环依赖

    spring解决循环依赖

    这篇文章主要介绍了spring如何解决循环依赖,帮助大家更好的理解和使用spring框架,感兴趣的朋友可以了解下
    2020-09-09
  • mybatis执行update批量更新时报错的解决方案

    mybatis执行update批量更新时报错的解决方案

    这篇文章主要介绍了mybatis执行update批量更新时报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot使用JUL实现日志记录功能

    SpringBoot使用JUL实现日志记录功能

    在SpringBoot中,我们可以使用多种日志框架进行日志记录,其中,JUL(Java Util Logging)是Java平台自带的日志框架,它提供了简单的 API 和配置,可以轻松地进行日志记录,本文将介绍如何在 SpringBoot中使用JUL进行日志记录,并提供示例代码
    2023-06-06
  • Spring Cloud分布式定时器之ShedLock的实现

    Spring Cloud分布式定时器之ShedLock的实现

    这篇文章主要介绍了Spring Cloud分布式定时器之ShedLock的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • SpringBoot返回对象时,如何将Long类型转换为String

    SpringBoot返回对象时,如何将Long类型转换为String

    这篇文章主要介绍了SpringBoot返回对象时,实现将Long类型转换为String,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java中unicode和中文相互转换的简单实现

    java中unicode和中文相互转换的简单实现

    下面小编就为大家带来一篇java中unicode和中文相互转换的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • MyBatis多对多映射初识教程

    MyBatis多对多映射初识教程

    这篇文章重点给大家介绍mybatis多对多映射,多对多映射的例子也很常见,本文通过代码实例相结合的方式给大家介绍mybatis多对多映射,需要的朋友参考下吧
    2016-08-08
  • 使用java实现telnet-client工具分享

    使用java实现telnet-client工具分享

    这篇文章主要介绍了使用java实现telnet-client工具,需要的朋友可以参考下
    2014-03-03
  • SpringBoot+Nacos+Kafka微服务流编排的简单实现

    SpringBoot+Nacos+Kafka微服务流编排的简单实现

    本文主要介绍了SpringBoot+Nacos+Kafka微服务流编排的简单实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论