springboot使用线程池(ThreadPoolTaskExecutor)示例

 更新时间:2022年01月23日 17:25:36   作者:返回主页云深小麦  
大家好,本篇文章主要讲的是springboot使用线程池(ThreadPoolTaskExecutor)示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

代码仓库:gitee

线程池创建

@Configuration
@EnableAsync
public class TaskPoolConfig {

    @Bean("syncExecutorPool")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        // 核心池大小
        taskExecutor.setCorePoolSize(5);
        // 最大线程数
        taskExecutor.setMaxPoolSize(10);
        // 队列程度
        taskExecutor.setQueueCapacity(100);
        // 线程空闲时间
        taskExecutor.setKeepAliveSeconds(60);
        // 线程前缀名称
        taskExecutor.setThreadNamePrefix("syncExecutor--");
        // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,
        // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        taskExecutor.setAwaitTerminationSeconds(60);
        // 线程不够用时由调用的线程处理该任务
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return taskExecutor;
    }
}

线程池参数

核心线程数量:CorePoolSize
看业务场景设置(我通常设置为CPU核心*1)

最大线程数量:MaxPoolSize
当核心线程数量都在使用状态时,会调用最大线程数量里的线程,使用的总线程不会超过最大线程数量,其余则等待(我通常设置为CPU核心*2)

队列程度:QueueCapacity
线程队列的大小

线程空闲时间:KeepAliveSeconds

线程前缀名称:ThreadNamePrefix

停机策略:WaitForTasksToCompleteOnShutdown
该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。

任务的等待时间:AwaitTerminationSeconds
任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住

拒接策略:RejectedExecutionHandler
线程不够用时由调用的线程处理该任务

线程池测试1(核心线程数量)

结果:线程池的核心线程数量轮训执行

线程池测试2(当核心线程数量和最大线程数量不够时)

随机睡眠0-10000毫秒
new Random().nextInt(10000)

结果:

当5个核心线程数量不够用时,使用最大线程数量里的线程
当最大线程数量不够用时,使用主线程执行该任务

// 线程不够用时由调用的线程处理该任务
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

总结

到此这篇关于springboot使用线程池(ThreadPoolTaskExecutor)示例的文章就介绍到这了,更多相关springboot线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis输入映射和输出映射实例详解

    mybatis输入映射和输出映射实例详解

    这篇文章主要介绍了mybatis输入映射和输出映射,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Redis缓存实例分步详解

    Redis缓存实例分步详解

    实际开发中缓存处理是必须的,不可能我们每次客户端去请求一次服务器,服务器每次都要去数据库中进行查找,为什么要使用缓存?说到底是为了提高系统的运行速度
    2023-04-04
  • 关于junit单元测试@Test的使用方式

    关于junit单元测试@Test的使用方式

    这篇文章主要介绍了关于junit单元测试@Test的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java -jar指定外部配置文件操作步骤

    java -jar指定外部配置文件操作步骤

    这篇文章主要给大家介绍了关于java -jar指定外部配置文件的相关资料,需要的朋友可以参考下
    2023-11-11
  • java中数组list map三者之间的互转介绍

    java中数组list map三者之间的互转介绍

    java中 数组 list map之间的互转一张图清晰呈现并附有代码,不懂的朋友可以参考下
    2013-10-10
  • 源码解析JDK 1.8 中的 Map.merge()

    源码解析JDK 1.8 中的 Map.merge()

    这篇文章主要介绍了JDK 1.8 之 Map.merge()的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • mybatis 查询返回Map<String,Object>类型

    mybatis 查询返回Map<String,Object>类型

    本文主要介绍了mybatis 查询返回Map<String,Object>类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • java 排序算法之选择排序

    java 排序算法之选择排序

    本文主要讲解了java 排序算法之选择排序,选择排序是最简单直观的一种算法,想要了解相关知识的朋友快来看一看这篇文章吧
    2021-09-09
  • Java面试题冲刺第二十六天--实战编程2

    Java面试题冲刺第二十六天--实战编程2

    这篇文章主要为大家分享了最有价值的三道java实战编程的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Nacos负载均衡策略总结

    Nacos负载均衡策略总结

    Nacos 作为目前主流的微服务中间件,包含了两个顶级的微服务功能:配置中心和注册中心,本文给大家总结了几种Nacos负载均衡策略,通过图文结合介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论