首页
点滴
SpringBoot 中使用默认线程池
在`org.springframework.boot.autoconfigure.task`包的`TaskExecutionAutoConfiguration.java`是SpringBoot默认的任务执行自动配置类。 从`@EnableConfigurationProperties(TaskExecutionProperties.class)`可以知道开启了属性绑定到`TaskExecutionProperties.java`的实体类上 ![](/images/20220223093146100.png) 进入到`TaskExecutionProperties.java`类中,看到属性绑定以`spring.task.execution`为前缀。默认线程池的核心线程数`coreSize=8`,最大线程数`maxSize = Integer.MAX_VALUE`,以及任务等待队列`queueCapacity = Integer.MAX_VALUE` 因为`Integer.MAX_VALUE`的值为2147483647(2的31次方-1),所以默认情况下,一般任务队列就可能把内存给堆满了。我们真正使用的时候,还需要对异步任务的执行线程池做一些基础配置,以防止出现内存溢出导致服务不可用的问题。 ![](/images/20220223093459909.png) #### 配置默认线程池 在`application.properties`配置文件中加入默认线程池的自定义信息 ``` # 核心线程数,默认为8 spring.task.execution.pool.core-size=3 # 最大线程数,默认为Integer.MAX_VALUE spring.task.execution.pool.max-size=20 # 任务等待队列容量,默认为Integer.MAX_VALUE spring.task.execution.pool.queue-capacity=10 # 空闲线程等待时间,默认为60s。如果超过这个时间没有任务调度,则线程会被回收 spring.task.execution.pool.keep-alive=60 # 是否允许回收空闲的线程,默认为true spring.task.execution.pool.allow-core-thread-timeout=true # 线程名前缀 spring.task.execution.thread-name-prefix=task- ``` 直接使用@Async注解则用的是默认的线程池 ```java @Service public class ThreadPoolService { private static final Logger log = LoggerFactory.getLogger(ThreadPoolService.class); @Async // 不指定线程池,则使用默认的线程池 public void threadPoolTest() { log.info("=========="+Thread.currentThread().getName()+"-处理任务=========="); try { Thread.sleep(10*1000); // 睡眠10秒,模拟处理业务逻辑耗费时间 log.info("=========="+Thread.currentThread().getName()+"-处理任务结束=========="); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在Controller中测试 ```java @RestController @RequestMapping("/threadPool") public class ThreadPoolController { @Autowired ThreadPoolService threadPoolService; @RequestMapping("/test") public void test(){ // 循环调用10次 for (int i = 0; i < 10; i++) { threadPoolService.threadPoolTest(); } } } ``` 因为在上面的配置文件中配了核心线程数为3,任务等待队列容量为10,所以只有3个线程在同时执行,其他的任务则放到阻塞队列中,当有线程执行结束空闲下来时,则中队列中取出待执行的任务来执行。 ![](/images/20220225104301350.png) 注意,在`TaskExecutionAutoConfiguration.java`类源码中`@ConditionalOnMissingBean(Executor.class)`表示在没有Executor类的Bean情况下才用默认的线程池。所以如果项目中配置自定义的线程池的时候是不会使用到这个默认的线程池的 ![](/images/20220225104540150.png)
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146