当前位置: 首页 > news >正文

springboot中线程池的使用

一、概念

        线程池就是将多个线程对象放入一个池子里面,例如一个池塘,线程池就是这个池塘,池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程,在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。

二、创建线程池的基本步骤

  1. 添加依赖(如果你使用的是Spring Boot,通常已经包含了必要的依赖):

    确保你的pom.xml(Maven)或build.gradle(Gradle)文件中包含了Spring Boot的依赖。

  2. 配置线程池

    在你的Spring Boot配置类(通常带有@Configuration注解)中,你可以创建一个TaskExecutor的Bean。例如,使用ThreadPoolTaskExecutor

    @Configuration  
    @EnableAsync  
    public class AsyncConfig {  @Bean(name = "taskExecutor")  public Executor taskExecutor() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setCorePoolSize(5);  executor.setMaxPoolSize(10);  executor.setQueueCapacity(25);  executor.setThreadNamePrefix("Async-");  executor.initialize();  return executor;  }  
    }

    注意@EnableAsync注解,它启用了异步方法的支持。你可以将此注解放在你的配置类上,或者使用@Async注解在你的服务或组件中直接指定某个方法为异步执行。

    线程池的参数说明:

    corePoolSize:核心线程数

    maximumPoolSize:最大线程数

    keepAliveTime:最大空闲时间

    unit:最大空闲时间单位

    workQueue:任务队列

    handler:拒绝策略,有以下四种

    (1)ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。

    (2)ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。

    (3)ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。

    (4)ThreadPoolExecutor.DiscardPolicy,丢弃任务,不过也不抛出异常。

    也可以自己实现RejectedExecutionHandler接口来自定义拒绝策略

  3. 使用线程池

    在你的服务或组件中,你可以使用@Async注解来指定某个方法应该异步执行,并使用上面配置的线程池。Spring会自动使用你配置的TaskExecutor来执行这些方法。

    @Service  
    public class AsyncService {  @Autowired  private TaskExecutor taskExecutor; // 也可以使用@Qualifier指定具体的Bean名,如@Qualifier("taskExecutor")  // 或者你可以直接通过@Async注解并使用默认配置的线程池  @Async  public void asyncMethod() {  // 异步执行的代码  }  // 使用自定义的TaskExecutor执行异步任务  public void executeAsync(Runnable task) {  taskExecutor.execute(task);  }  
    }

    请注意,如果你的AsyncService中的方法是通过接口定义的,并且你正在使用基于接口的代理(这是Spring AOP的默认行为),那么只有通过代理调用这些方法时,@Async注解才会生效。这意味着,如果你从同一个类的另一个方法中调用带有@Async注解的方法,它不会异步执行。

  4. 监控和调优

     

    你可以使用Spring Boot的Actuator模块来监控你的线程池。通过添加Actuator的依赖并启用相关端点,你可以查看线程池的实时状态,如当前线程数、活动线程数、任务队列大小等。这有助于你根据应用程序的实际需求调整线程池的配置。

相关文章:

  • spring模块(三)Spring AOP(2)使用
  • Django的模型层
  • [图解]产品经理-竞赛题解析:阿布思考法和EA
  • jQuery实现瀑布流
  • css3 笔记01
  • MFC密码对话框之间数据传送实例(源码下载)
  • 打造有情感的AI智能体-情感问答
  • 如何解决0.1+0.2!=0.3的问题
  • 手机上制作证件照
  • gerrit自启动方案—windows服务
  • 1.手动LogisticRegression模型的训练和预测
  • Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储
  • linux系统——top资源管理器
  • Lua 基础 03 常用函数
  • 云端力量:利用移动云服务器高效部署Spring Boot Web应用
  • python3.6+scrapy+mysql 爬虫实战
  • “大数据应用场景”之隔壁老王(连载四)
  • 11111111
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • es6
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS专题之继承
  • Node 版本管理
  • quasar-framework cnodejs社区
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue.js 移动端适配之 vw 解决方案
  • 前端
  • 深入 Nginx 之配置篇
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 学习笔记TF060:图像语音结合,看图说话
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ‌移动管家手机智能控制汽车系统
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • ######## golang各章节终篇索引 ########
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (pojstep1.1.2)2654(直叙式模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (初研) Sentence-embedding fine-tune notebook
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (四)React组件、useState、组件样式
  • (一) storm的集群安装与配置
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Google的Objective-C编码规范
  • ***监测系统的构建(chkrootkit )
  • .dwp和.webpart的区别
  • .NET 8 跨平台高性能边缘采集网关
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET NPOI导出Excel详解
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 中的轻量级线程安全
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)