spring中使用ThreadPoolTaskExecutor配置线程池

这篇具有很好参考价值的文章主要介绍了spring中使用ThreadPoolTaskExecutor配置线程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

spring中经常使用ThreadPoolTaskExecutor来调用JDK的ThreadPoolExecutor初始化线程池, 尤其在有异步执行的任务时, 由于spring 异步任务默认使用的executor不会reuse线程, 因此需要设置默认线程池, 来替换spring 默认的SimpleAsyncTaskExecutor

spring中使用ThreadPoolTaskExecutor配置线程池

参数

ThreadPoolTaskExecutor 不同的参数设置会使executor采用不同的策略

  • CorePoolSize 核心线程数

    默认值为1, 默认不会空闲销毁的线程, 可以设置AllowCoreThreadTimeOut=true(默认为false)控制核心线程空闲回收

  • MaxPoolSize 最大线程数

    线程池能容纳的最大线程数

  • QueueCapacity 线程池队列容量

    只有当队列容量满了, 才会创建新的线程执行任务, 否则放在队列中等待, 并且等待核心线程处理任务

  • RejectedExecutionHandler 当线程池达到max size时, 执行的策略

    如果线程池满了, 再进来新的任务, 将会执行rejected策略

改变上述参数值, 线程池分别表现为以下策略:

if 「线程池中线程的数量」<「corePoolSize 」:

创建新的线程来处理任务, 即便线程池中其他线程都是空闲状态

else if 「线程池中线程的数量」==「corePoolSize 」

&& 「QueueCapacity」未满 :

任务将被放入队列中等待线程执行

else if 「线程池中线程的数量」>「corePoolSize 」

&& 「QueueCapacity」已满

&& 「线程池中线程的数量」<「MaxPoolSize」:

创建新的线程来处理任务

else if 「线程池中线程的数量」<「corePoolSize 」

&& 「QueueCapacity」已满

&& 「线程池中线程的数量」==「MaxPoolSize」:

通过制定rejectedHandler处理

综上, 线程池执行的顺序即:

  • 核心线程corePoolSize?
  • 任务队列workQueue?
  • 最大线程 maximumPoolSize?
  • 如果三者都满了,使用handler处理被拒绝的任务

另外 如果线程池中的线程数 > 「corePoolSize」, 并且超过了『keepAliveTime(默认为60s)』, 线程将被回收, 以此来达到动态管理线程池的线程数

如何设置这些值

因为要考虑:

  • 运行机器的硬件参数
  • 期望的CPU占用率
  • 不同应用程序类型(IO密集型/CPU密集型)
  • 业务场景是否特别要求性能

种种情况, 组合的case就非常多了, 推荐的设置值是:

  • corePoolSize = CPU线程数/2

    Runtime.getRuntime().availableProcessors()//获取逻辑核心数,如6核心12线程,那么返回的是12

  • maxPoolSize = CPU 线程数

  • queueCapacity = ( corePoolSize / 任务处理时间 ) * 期望等待时间(秒)

  • rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy() 如果线程池满了, 丢给caller线程执行

有兴趣参考:

https://juejin.cn/post/6948034657321484318

写在最后

但是软件工程实践没有银弹 , 一切都要结合实际场景去考虑文章来源地址https://www.toymoban.com/news/detail-427857.html

到了这里,关于spring中使用ThreadPoolTaskExecutor配置线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

    在 Spring 中,@Async 注解用于将方法标记为异步执行的方法。当使用 @Async 注解时,该方法将在单独的线程中执行,而不会阻塞当前线程。这使得方法可以在后台执行,而不会影响主线程的执行。 在您提供的代码示例中,a1() 和 a2() 方法都被标记为 @Async,意味着它们将以异步方

    2024年01月19日
    浏览(28)
  • Spring Boot使用@Async实现异步调用:自定义线程池

    第一步,先在Spring Boot主类中定义一个线程池,比如: 上面我们通过使用​​ ThreadPoolTaskExecutor ​​创建了一个线程池,同时设置了以下这些参数: 核心线程数10:线程池创建时候初始化的线程数 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核

    2024年02月14日
    浏览(33)
  • Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

    目录 前言 原因分析 解决方案 方案1:手动设置线程中的认证信息 方案2:使用 DelegatingSecurityContextRunnable 创建线程 方案3:修改 Spring Security 安全策略 通过设置JVM参数修改安全策略 通过 SecurityContextHolder 修改安全策略 总结 近日心血来潮想做一个开源项目,目标是做一款可以适

    2024年02月19日
    浏览(28)
  • Spring框架的背景学习

    组成 Spring 框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。每个模块的组成和功能如下: 从 spring-core 入手,其次是 spring-beans 和 spring-aop,随后是 spring-context,再其次是 spring-tx 和 spring-orm,最后是 spring-web 和其他部分。

    2024年01月18日
    浏览(26)
  • 【C++】做一个飞机空战小游戏(四)——给游戏添加背景音乐(多线程技巧应用)

      [导读]本系列博文内容链接如下: 【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 【C++】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C++】做一个飞

    2024年02月14日
    浏览(31)
  • SpringBoot 利用 ThreadPoolTaskExecutor 批量插入数十万条数据

    在批处理插入数据时,如果在单线程环境下是非常耗时的,本篇文章将采用单线程和多线程进行对比,利用 ThreadPoolTaskExecutor 进行多线程批处理插入65w数据,然后和单线程进行对比,最终得到性能优化。 yml 文件配置 spring 容器注入线程池 bean 对象 创建异步线程业务类 创建单

    2024年02月14日
    浏览(32)
  • ThreadPoolTaskExecutor中的execute()方法和submit()方法有什么区别?

    ThreadPoolTaskExecutor是Spring框架中的一个线程池实现,它提供了execute()和submit()两种方法用于启动异步任务。 execute()方法: 返回值类型为void; 接收一个Runnable类型的参数; 直接启动线程执行任务,不会返回一个Future对象; 如果任务抛出异常,线程池中的线程会捕获并记录异常

    2024年02月03日
    浏览(29)
  • 【Java项目】使用Nacos实现动态线程池技术以及Nacos配置文件更新监听事件

    真诚的希望能给我项目一个stars!!! 项目源码 项目视频演示 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如Tomcat。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性

    2024年02月09日
    浏览(26)
  • spring retry 配置及使用

    依赖 开始使用 代码示例 业务注解 代码示例 注意 两个方法的返回值要一样,否则是不起作用的 NullPointerException 必须要将异常类型当作参数传入 如果不这样的话无法进行回调,当然不配置 @Recever 也可以,那就不会有回调处理了 写一个action 调用一下方法 输出结果 以上最简单

    2024年01月19日
    浏览(29)
  • Spring 配置方案(注解的使用)

    替换: 1、注入类 (1)@Component 1、含义 将注解所修饰的类,注入spring容器 2、位置 使用在类的前面 3、语法 @Component(value = “id”) 如果省略 value = “id” 默认注入的id为类的名称且首字母小写 4、注意 不可以单独使用 在xml中配合 context:component-scan base-package=“”/context:compone

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包