当前位置: 首页 > 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的依赖并启用相关端点,你可以查看线程池的实时状态,如当前线程数、活动线程数、任务队列大小等。这有助于你根据应用程序的实际需求调整线程池的配置。

http://www.lryc.cn/news/352436.html

相关文章:

  • ubuntu20.04 开机自动挂载外加硬盘
  • 5.18 TCP机械臂模拟
  • linux---线程控制
  • 低代码开发:拖拽式可视化构建工业物联网系统
  • 【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇
  • webpack 学习之 五大核心
  • Android逆向抓包技巧 - Hook 底层通信
  • 深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
  • 模板方法及设计模式——Java笔记
  • K8S认证|CKA题库+答案| 11. 创建PVC
  • 多微信如何高效管理?一台电脑就能搞定!
  • 安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error
  • JVM解释器和即时编译器的工作原理
  • 【产品经理】输出
  • MySQL入门学习.数据库组成.存储引擎
  • 【算法】分治 - 快速排序
  • 设计模式13——桥接模式
  • 第十六讲:数据在内存中的存储
  • 【EXCEL_VBA_基础知识】15 使用ADO操作外部数据
  • 如何在Spring中配置Bean?
  • 深入学习 torch.distributions
  • Java中的判断校验非空问题
  • webman使用summernote富文本编辑器
  • jQuery里添加事件 (代码)
  • Java数组的使用
  • 如何参与github开源项目并提交PR
  • 拼多多携手中国农业大学,投建陕西佛坪山茱萸科技小院
  • 技术前沿 |【自回归视觉模型ImageGPT】
  • Manjaro linux install RedisGUI (RedisInsight)亲测2024-5-25
  • debian/control文件中常见字段的介绍