开发者

SpringBoot 整合线程池的示例详解

目录
  • 线程池简介
    • 什么是线程池
    • 线程池的优点
  • 1.启动类加 @EnableAsync 注解
    • 2.在方法上加 @Async 注解
      • 3.创建线程池配置类
        • 创建线程池配置类
        • 配置多个线程池

      线程池简介

      什么是线程池

      线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在Java中主要是使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池(不推荐使用)。

      线程池的优点

      • 降低资源消耗,复用已创建的线程来降低创建和销毁线程的消耗。
      • 提高响应速度,任务到达时,可以不需要等待线程的创建立即执行。
      • 提高线程的可管理性,使用线程池能够统一的分配、调优和监控。

      1.启动类加 @EnableAsync 注解

      @SpringBootApplication
      @EnableAsync
      public class FacadeH5Application {
          public static void main(String[] args) {
              SpringApplication.run(FacadeH5Application.class, args);
          }
      }

      2.在方法上加 @Async 注js

      @Async
      public void m1() {
          //do something
      }

      注意:导致 @Async 注解失效的几个原因

      • 两个方法都在同一个类里面,一个方法调用另一个异步方法,不生效。但是如果在本类中注入自己的实例,再通过自己的实例调用异步方法就可行。
      • @Async 方法所在的类没有交给 spring 代理(没加诸如@Component注解),不生效。
      • 注解的方法不是是public方法,不生效。

      3.创建线程池配置类

      默认的线程池配置如下

      # 核心线程数
      spring.task.execution.pool.core-size=8  
      # 最大线程数
      spring.task.execution.pool.max-size=16
      # 空闲线程存活时间
      spring.task.execution.pool.keep-alive=60s
      # 是否允许核心线程超时
      spring.task.execution.pool.allow-core-thread-timeout=true
      # 线程队列数量
      spwww.devze.comring.task.execution.pool.queue-capacity=100
      # 线程关闭等待
      spring.task.execution.shutdown.await-termination=false
      spring.task.execution.shutdown.await-termination-period=
      # 线程名称前缀
      spring.task.execution.thread-name-prefix=task-

      创建线程池配置类

      @Configuration
      public class ThreadPoolConfig {
          @Bean
          public TaskExecutor taskExecutor(){
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              //设置核心线程数
              executor.setCorePoolSize(10);
              //设置最大线程数
              executor.setMaxPoolSize(20);
              //设置队列容量
              executor.setQueueCapacity(20);
              //设置线程活跃时间
      编程        executor.setKeepAliveSeconds(30);
              //设置线程名称前缀
              executor.setThreadNamePrefix("sendSms-");
              //设置拒绝策略
              executor.setRejectejsdExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
              //等待所有任务结束后再关闭线程池
              executor.setWaitForTasksToCompleteOnShutdown(true);
           www.devze.com   //设置线程池中任务的等待时间
              executor.setAwaitTerminationSeconds(60);
              return executor;
          }
      }

      配置多个线程池

      有时候,一个项目中如果配置了多个线程池,那需要在 @Bean后面加上线程池的名称

      @Configuration
      public class ThreadPoolConfig {
          @Bean("ThreadPool1")
          public TaskExecutor taskExecutor(){
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
      		......
              return executor;
          }
          @Bean("ThreadPool2")
          public TaskExecutor taskExecutor(){
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
      		......
              return executor;
          }
      }

      在使用 @Async注解时就需要指明具体使用的线程池,如下格式

      @Async("ThreadPool1")
      public void m1() {
          //do something
      }

      到此这篇关于SpringBoot 整合线程池的文章就介绍到这了,更多相关SpringBoot 整合线程池内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜