SpringBoot使用线程池

SpringBoot使用线程池,第1张

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

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

看一下jdk中线程池继承关系类图:
JDK中,使用 ThreadPoolExecutor 给创建了几个不同功能种类的线程池,可以调出来看看:

看一下都有什么特点:

从上面可以看出他们各有各的特点,但是阿里巴巴开发守则却不推荐使用以上线程池,因为它们可能会对服务资源的浪费,所以推荐使用通过ThreadPoolExecutor自定线程池。
Spring中将Java中的线程池进行了封装,而且提供了默认实现,也能自定义线程池,我一般都用Spring中的线程池包。

Spring中的线程池和JDK中的基本一样,在 orgspringframeworkschedulingconcurrent 包下面。
和JDK中对应的,Spring的顶层接口是 TaskExecutor ,它实现了JDK中的 Executor 接口。
Spring中常用的线程池是 ThreadPoolTaskExecutor ,它是是借助于JDK并发包中的 javautilconcurrentThreadPoolExecutor 来实现的。
要想使用线程池,先了解一下线程池中的一些参数:

因为我们常用的是 ThreadPoolExecutor 线程池,所以去这个类中找。
上面配置了线程池,并生成了线程池bean,交给了Spring容器管理,使用时注入即可使用。

SpringBoot线程池自动装配在 spring-boot-autoconfigure 这个jar中,在 orgspringframeworkbootautoconfiguretaskTaskExecutionAutoConfiguration 类中。
自动装配条件:
当往线程池中提交新任务时,线程池主要流程如下:
核心线程数 -> 线程队列 -> 最大线程数 -> 拒绝策略

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

重要的特征也就是最大程度利用线程
首先,创建线程本身需要额外(相对于执行任务而必须的资源)的开销
作业系统在每创建一个线程时,至少需要创建以下资源:
(1) 线程内核对象:用于对线程上下文的管理
(2) 用户模式执行栈
(3) 内核模式执行栈
这些资源被线程占有后作业系统和用户都无法使用
相反的过程,销毁线程需要回收资源,也需要一定开销
其次,过多的线程将导致过度的切换线程切换带来的性能更是不可估量系统完成线程切换要经过以下过程:
(1) 从用户模式切换到内核模式
(2) 将CPU寄存器的值保存到当前线程的内核对象中
(3)打开一个自旋锁,根据调度策略决定下一个要执行的线程释放自旋锁,如果要执行的线程不是同一进
程中的线程,还需要切换虚拟内存等进程环境
(4) 将要执行的线程的内核对象的值写到CPU寄存器中
(5) 切换到用户模式执行新线程的执行逻辑
所以线程池的目的就是为了减少创建和切换线程的额外开销,利用已经的线程多次循环执行多个任务从而提
高系统的处理能力

最简单的可以利用javautilconcurrentExecutors
调用ExecutorsnewCachedThreadPool()获取缓冲式线程池
ExecutorsnewFixedThreadPool(int nThreads)获取固定大小的线程池

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

其中Resin从V30后需要购买才能用于商业目的,而其他两种则是纯开源的。可以分别从他们的网站上下载最新的二进制包和源代码。
作为Web容器,需要承受较高的访问量,能够同时响应不同用户的请求,能够在恶劣环境下保持较高的稳定性和健壮性。在>创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK15开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。


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

原文地址: https://www.outofmemory.cn/yw/13330939.html

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

发表评论

登录后才能评论

评论列表(0条)

保存