在日常的开发项目过程中,时常会有多线程的使用场景。最近开发的需求中也是如此,只不过这次需要开启多线程去执行,最后要等所有线程结束统一获取结果。所以在此整理一下,我们目前用的是方法二。
启动类添加@EnableAsync注解
service层方法
参考:
SpringBoot线程池ThreadPoolExecutor
SpringBoot线程池ThreadPoolTaskExecutor
一、关于前台线程和后台线程
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资源当应用程序的压力减轻,那么它会销毁不用的线程。
以上就是关于springboot多任务并行+线程池处理+等待获取执行结果全部的内容,包括:springboot多任务并行+线程池处理+等待获取执行结果、c#线程之前台线程后台线程及使用、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)