哈喽,大家好,我是了不起。
我们在日常开发中,经常跟多线程打交道,Spring 为我们提供了一个线程池方便我们开发,它就是 ThreadPoolTaskExecutor ,接下来我们就来聊聊 Spring 的线程池吧。
SpringBoot 提供了注解 @Async 来使用线程池, 具体使用方法如下:
下面是一个简单的例子:
@Component@EnableAsync@EnableSchedulingpublic class ScheduleTask { @Async @Scheduled(fixedRate = 2000) public void testAsync1() { try { Thread.sleep(6000); System.out.println(LocalDateTime.now() + "--线程1:" + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } @Async @Scheduled(cron = "*/2 * * * * ?") public void testAsync2() { try { Thread.sleep(1000); System.out.println(LocalDateTime.now() + "--线程2:" + Thread.currentThread().getName()); } catch (Exception ex) { ex.printStackTrace(); } }}
启动项目,得到如下日志结果:
图片
可以发现在当前环境下 task-${id} 这个 id 并不是一直增长的,而是一直在复用 1-8。这个时候可能就会有的小伙伴们会比较好奇,默认的不是 SimpleAsyncTaskExecutor 吗?为什么从日志打印的效果上看像是一直在复用 8 个线程,难道用的是 ThreadPoolTaskExecutor?
原因是 SpringBoot2.1.0 版本后,新增了 TaskExecutionAutoConfiguration 配置类。其中声明的默认线程池就是 ThreadPoolTaskExecutor 。而 @Async 在选择执行器的时候会先去 IOC 容器中先找是否有 TaskExecutor 的 Bean对象,所以在当前版本 SpringBoot 中,@Async 的默认 TaskExecutor 是 ThreadPoolTaskExecutor。
在 SpringBoot 项目中,我们可以在 yaml 或者 properties 配置文件中配置,或者使用 @Configuration 配置,下面演示配置方法。
# 核心线程池数spring.task.execution.pool.core-size=5# 最大线程池数spring.task.execution.pool.max-size=10# 任务队列的容量spring.task.execution.pool.queue-capacity=5# 非核心线程的存活时间spring.task.execution.pool.keep-alive=60# 线程池的前缀名称spring.task.execution.thread-name-prefix=test-task-
@Bean(name = "myThreadPoolTaskExecutor")public ThreadPoolTaskExecutor getMyThreadPoolTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); int i = Runtime.getRuntime().availableProcessors(); taskExecutor.setCorePoolSize(i * 2); taskExecutor.setMaxPoolSize(i * 2); taskExecutor.setQueueCapacity(i * 2 * 100); taskExecutor.setKeepAliveSeconds(60); taskExecutor.setThreadNamePrefix("my-task-"); taskExecutor.initialize(); return taskExecutor;}
RejectedExectutionHandler 参数字段用于配置绝策略,常用拒绝策略如下
上面简单介绍了 Spring 自带的线程池 ThreadPoolTaskExecutor 的配置和使用,并且讲了线程池的参数和处理流程。当然Spring提供了7个线程池的实现,感兴趣的可以自行了解~
本文链接:http://www.28at.com/showinfo-26-13250-0.html解密SpringBoot线程池
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com