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 类中。

自动装配条件:

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

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

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

为什么要用线程池?诸如Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 >

进程与线程的区别有开销不同、所处环境不同、内存分配不同等。

每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销。线程可以看做轻量级的进程,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

在 *** 作系统中能同时运行多个进程(程序),而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。

系统在运行的时候会为每个进程分配不同的内存空间,对线程而言,除了CPU外系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

进程与线程的关系

进程(process)和线程(thread)是 *** 作系统的基本概念,但是它们比较抽象,不容易掌握。计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。一个车间里,可以有很多工人。他们协同完成一个任务,线程就好比车间里的工人。一个进程可以包括多个线程,车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

姓名:王央京    学号:18050100052   学院:电子工程学院

转自:>

一、关于前台线程和后台线程

1、简介

CLR中线程分为两种类型,一种是前台线程、另一种是后台线程

前台线程:应用程序的主线程、Thread构造的线程都默认为前台线程

后台线程:线程池线程都为后台线程

2、区别

21 前台线程:前台线程一般执行重要性很高的任务,至于什么是重要性很高,这个需要结合业务综合考虑,哪些 *** 作是当前应用程序必须执行的。

如下控制台程序:

控制台等待DoWork方法执行完成之后关闭。

22 后台线程:这里需要注意,当一个进程的所有前台线程关闭时,也就是当应用程序推出的时候,无论后台线程有没有执行完它的任务,它都会被强制关闭但是,当应用程序开启时,它又会重新启动后台线程一般执行不重要、耗时很短的任务,就算进程(应用程序)关闭了,导致它强制关闭,也不会造成影响的任务比如系统清理程序等。

如下控制台程序:

控制台不等子线程处理完成,直接关闭。

注意:一般进程会在所有的前台线程执行完毕时关闭。

二、使用Thread构建异步 *** 作(受限制)

1、Thread简介和使用场景

关于使用Thread类构建线程执行异步 *** 作有以下几点需要注意的:

(1)、Thread本身微软并不建议使用,应为它其中的很多Api并不靠谱(如Start、Join、IsBackground等)

(2)、由于(1)的问题,所以微软将整个Thread类都不开放给Windows Store应用

虽然Thread有很多不好的缺点,但是它还是有它的用武之处,只要满足以下条件:

(1)、如果执行的代码处于一种特定的状态,这种状态对于线程池来说时非同寻常的。

(2)、线程需要以非普通优先级运行所有线程池线程都以普通优先级运行,虽然可以修改,但是在不同线程池之间,这种优先级无法持续。

(3)、需要线程变现为一个前台线程(什么是前台线程,上面有解释),防止应用程序在线程结束前就关闭了这个后台线程无法做到(也就是线程池线程)

(4)、线程需要执行长时间的计算任务。

(5)、线程可能存在终止的情况,程序池线程不存在这种情况(它会一直执行)Thread类的Abort方法。

三、CLR线程池

1、进程和CLR的关系

一个进程可以只包含一个CLR,也可以包含多个CLR

2、CLR和AppDomain的关系

一个CLR可以包含多个AppDomain

3、CLR和线程池的关系

一个CLR只包含一个线程池

所以得出一个CLR下的多个AppDomain共享一个线程池和一个进程下的多个CLR拥有多个线程池的结论注:多个线程池间的线程池相互不产生影响。

4、CLR和线程池和 *** 作请求队列的关系

(1)、CLR第一次初始化时,线程池并没有线程,当应用程序调用异步代码执行一个方法时,会将该请求记录项加入到 *** 作请求队列中,线程池的代码从这个队列中获取记录项,并派发给线程池线程,接着

线程池会创建线程,当然这里会有性能开销,但是当该线程执行完毕之后,线程池会回收这个线程,这里注意:线程池不会直接销毁这个线程,而是让它处于闲置状态这样就不会产生额外的性能开销。

但是如果该线程如果长时间处于闲置状态,那么线程池会销毁它,关于这个时间的计算很复杂,各个CLR对它的定义各不相同。

(2)、当应用程序向线程池发起了多个请求,线程池会尝试用一个线程来处理你所有的请求,但是如果这个线程处理压力过大,那么它会开启一个新的线程来给它分担压力以此类推。

(3)、线程池之包含了少量线程,因为如果线程太多,会增加性能开销,当然如果你升级了你电脑的cpu,线程池则会创建更多的线程这个过程线程池会自动的去读取你得cpu核数信息,自动的去分配合适的线程数

合理地分配CPU资源当应用程序的压力减轻,那么它会销毁不用的线程。

以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。

线程(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。

一个进程和一个线程最显著的区别是:线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域, *** 作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样

进程概念

进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。

在Mac、Windows NT等采用微内核结构的 *** 作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程概念

线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上 *** 作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序, *** 作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样, *** 作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。 *** 作系统提供线程就是为了方便而有效地实现这种并发性

引入线程的好处

(1)易于调度。

(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

(3)开销少。创建线程比创建进程要快,所需开销很少。。

(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

进程和线程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

另外,团IDC网上有许多产品团购,便宜有口碑

1、线程的定义

线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。

线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此, *** 作系统中线程的概念便被引进了。

线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。

2、线程的作用:

线程的作用很多,举个最为典型的例子:

当需要在网络上放一个服务端,一个客户端访问时,就会新建一个线程处理这个客户端的事务,这样的话只要不断新建线程就可以处理多个用户的请求了。

扩展资料

线程的五种状态:

1、新生状态(New)

当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生状态。 此时线程不是活着的(not alive);

2、就绪状态(Runnable)

通过调用线程实例的start()方法来启动线程使线程进入就绪状态;但还没有被分配到CPU,处于线程就绪队列;此时线程是活着的(alive)。

3、运行状态(Running)

一旦获取CPU,线程就进入运行状态,线程的run()方法才开始被执行,如果在给定的时间内没有执行结束,就会被系统给换下来回到线程的就绪状态,此时线程是活着的(alive)。

4、阻塞状态(Blocked)

通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞状态,此时线程是活着的(alive)。

5、死亡状态(Dead)

当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡状态。处于Dead状态调用start()方法,会出现异常。

参考资料:

百度百科-线程

以上就是关于SpringBoot使用线程池全部的内容,包括:SpringBoot使用线程池、为什么要使用线程池、进程与线程的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/10077685.html

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

发表评论

登录后才能评论

评论列表(0条)

保存