SpringBoot使用线程池

SpringBoot使用线程池,第1张

线程池是一种线程使用模式。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

使用线程池,有几点好处:

Java开发,我们使用JDK环境,开发框架基本都是Spring全家桶。线程池的基础原理都在JDK中,JDK1.5新增线程池相关类,在核心jar包 rt.jar 中, java.util.concurrent 下面。

看一下jdk中线程池继承关系类图:

JDK中,使用 ThreadPoolExecutor 给创建了几个不同功能种类的线程池,可以调出来看看:

看一下都有什么特点:

从上面可以看出他们各有各的特点,但是阿里巴巴开发守则却不推荐使用以上线程池,因为它们可能会对服务资源的浪费,所以推荐使用通过ThreadPoolExecutor自定线程池。

Spring中将Java中的线程池进行了封装,而且提供了默认实现,也能自定义线程池,我一般都用Spring中的线程池包。

Spring中的线程池和JDK中的基本一样,在 org.springframework.scheduling.concurrent 包下面。

和JDK中对应的,Spring的顶层接口是 TaskExecutor ,它实现了JDK中的 Executor 接口。

Spring中常用的线程池是 ThreadPoolTaskExecutor ,它是是借助于JDK并发包中的 java.util.concurrent.ThreadPoolExecutor 来实现的。

要想使用线程池,先了解一下线程池中的一些参数:

因为我们常用的是 ThreadPoolExecutor 线程池,所以去这个类中找。

上面配置了线程池,并生成了线程池bean,交给了Spring容器管理,使用时注入即可使用。

SpringBoot线程池自动装配在 spring-boot-autoconfigure 这个jar中,在 org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration 类中。

自动装配条件:

当往线程池中提交新任务时,线程池主要流程如下:

核心线程数 ->线程队列 ->最大线程数 ->拒绝策略

所以使用线程池,需要注意:

我们的需要新建一个Configuration 类来配置我们的线程池参数。

其中我们的静态参数也可以放在配置文件中,我这边使用的 yml 配置文件:

上边的这里需要用注解来引用对象方式实现:

userPackAgeData 方法添加指定线程名:

spring提供了线程池,只需要加@Autowired就可以使用

该线程池的默认线程数量为设备的CPU核心数,8核则8线程,16核则16线程,可以通过配置更改。

最近发现有时在项目中直接使用线程池会报出找不到bean的问题,可能是spring boot版本不同,导致没有自带线程池,此时需要在spring配置类里加入以下的bean


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11736198.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存