问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Spring的线程池和JDK的线程池的区别

发布网友 发布时间:2022-04-22 02:19

我来回答

1个回答

热心网友 时间:2023-09-30 13:23

API 文档中很清楚,SpringFrameWork 的 ThreadPoolTaskExecutor 是辅助 JDK 的 ThreadPoolExecutor 的工具类,它将属性通过 JavaBeans 的命名规则提供出来,方便进行配置。
1.ThreadPoolExecutor
spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的Java.util.concurrent.ThreadPoolExecutor来实现的.下面先学习下ThreadPoolExecutor中的相关信息.ThreadPoolExecutor构造函数如下:

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

下面分别说下各项代表的具体意义:

int corePoolSize:线程池维护线程的最小数量.
int maximumPoolSize:线程池维护线程的最大数量.
long keepAliveTime:空闲线程的存活时间.
TimeUnit unit: 时间单位,现有纳秒,微秒,毫秒,秒枚举值.
BlockingQueue<Runnable> workQueue:持有等待执行的任务队列.
RejectedExecutionHandler handler:
用来拒绝一个任务的执行,有两种情况会发生这种情况。
一是在execute方法中若addIfUnderMaximumPoolSize(command)为false,即线程池已经饱和;
二是在execute方法中, 发现runState!=RUNNING || poolSize == 0,即已经shutdown,就调用ensureQueuedTaskHandled(Runnable command),在该方法中有可能调用reject。

Reject策略预定义有四种:
(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。
(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
(3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).

2. Spring中ThreadPoolTaskExecutor的使用
最常用方式就是做为BEAN注入到容器中,如下代码:

Java代码
<bean id="threadPoolTaskExecutor"
class="org.springframework.scheling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="15" />
<property name="queueCapacity" value="1000" />
</bean>

ThreadPoolExecutor执行器的处理流程:
(1)当线程池大小小于corePoolSize就新建线程,并处理请求.
(2)当线程池大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理.
(3)当workQueue放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理.
(4)另外,当线程池的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁.

了解清楚了ThreadPoolExecutor的执行流程,开头提到的org.springframework.core.task.TaskRejectedException异常也就好理解和解决了.ThreadPoolTaskExecutor类中使用的
就是ThreadPoolExecutor.AbortPolicy()策略,直接抛出异常.
请教各位前辈Spring的线程池和JDK的线程池的区别

Spring的线程池是为spring自己使用线程的部件而写的。使得spring组件不依赖Java的并行库而只依赖自己简化的线程相关的封装...Spring是希望下游以符合Spring惯例的扩充方式去使用所有的功能。当然,直接用JDK也可以。

Java高并发编程实战5,异步注解@Async自定义线程池

Async注解的作用是异步处理任务。在使用@Async时,如果不指定线程池的名称,默认线程池是Spring默认的线程池SimpleAsyncTaskExecutor。默认线程池的配置如下:从最大线程数可以看出,在并发情况下,会无限制地创建线程。也可以通过yml重新配置:也可以自定义线程池,下面通过简单的代码来实现@Async自定义线程池。

java 什么是线程池

在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

java 如何获得线程池中正在执行的线程数?

largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+ getActiveCount:获取活动的线程数。通过扩展线程池进行监控。通过继承线程池并...

线程池如何让主线程知道所有子线程已经执行完成

二就是线程池对空闲线程的销毁存在一个keepAliveTime,只有要将keepAliveTime减小到你getPoolSize的频率时,可能才能正确判断。并且如果使用ThreadPoolExecutor,对于池中的线程,你无法针对某一个线程进行操作。我的感觉,你现在的需求不符合使用线程池的需求,你需要的是一个线程管理类而不是池。---解决方...

线程池调优之动态参数配置

如果任务是CPU密集型配置:工作线程=cpu核心数+1;如果任务是IO密集型场景:工作线程=cpu核心数*2;所以上面例子中就是基于CPU密集型任务配置线程池。而且网上大部分文章描述线程池配置也是基于这两点来分析的。可惜理想很丰满,现实很骨感。在实际工作场景中,其实没那么容易区分线程中执行的任务是CPU密集...

JAVA线程池shutdown和shutdownNow的区别

当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。shutdownNow()根据JDK文档描述,大致意思是:执行该方法,线程池的状态立刻...

对于OpenJDK而言,是不是每个Java线程都对应一个执行引擎线程

对于OpenJDK而言,是不是每个Java线程都对应一个执行引擎线程 这个方法当然不可行。我给你举个例子,你去火车站买票。窗口就这么多,有人来了就排队,不会每个人都有一个窗口。如果人实在太多了,可以考虑增设一些窗口,人少了,又可以关闭一些窗口。线程可以重复使用,不必执行完一个线程就销毁了。售票...

超详细的线程池使用解析

shutdown() 和 shutdownNow() 方法的区别在于 shutdownNow 方法首先将线程池的状态设置为 STOP,然后尝试停止正在执行或暂停任务的线程,并返回等待执行任务的列表,而 shutdown 只是将线程池的状态设置成 SHUTDOWN 状态,然后中断所有没有正在执行任务的线程。

使用线程池时一定要注意的五个点

JAVA 中(JDK 1.5+)线程池的种类:程序不能使用来自有界线程池的线程来执行依赖于线程池中其他任务的任务。有两个场景:要缓解上面两个场景产生的问题有两个简单的办法:真正解决此类方法还是需要梳理线程池执行业务流程,不要在有界线程池中执行相互依赖的任务,防止出现竞争和死锁。向线程池提交的任务...

进程池和线程池的区别 线程池和连接池的区别 多线程与线程池的区别 线程和线程池区别 单线程和多线程的区别 线程池的类型和区别 task和线程池的区别 线程池的区别 多线程线程池
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
洛洛如果我没有女朋友我肯定追你,虽然你比我大,帮助我、鼓励我、哄我... 男生向你表达了喜欢,但他有女朋友,还说什么,如果我没有女朋友我估计我... ...个男生总在我和另一个男生面前说他要是没有女朋友就追我的话,这代 ... 一个男生对一个女生说:" 如果我没有女朋友,我肯定会和你在一起”是什... 他说:我要是没有女友,一定要追求你,的潜台词是什么 男人说:如果我没有女朋友,我一定会去追你是什么意思? 哥特式建筑英国 突发性耳鸣与神经性耳鸣有什么区别啊 神经性耳鸣和突发性耳聋有什么区别 神经性耳鸣和突发性耳鸣有什么区别 Android的App中线程池的使用,具体使用多少个线程池 什么是线程池,如何使用,为什么要用 什么是线程池 jdk 提供的线程池有几种策略 创建线程有几种方式和Java中常用的线程池 java 线程池 限定 每秒多少次 线程池的几种常见的创建的方式 浅谈java常用的几种线程池比较 Java线程池 Java 中几种常用的线程池 常用的线程池 常见线程池类型有哪些 Excel中的小方框怎么打 空白处字excel怎么做. 征途2空白符号如何打出来,国聊空白。看人物前面带... word中,代表空格的小方框是怎样输入的。 全角空格这个方框□要怎么打出来啊?我明明已经在输... WPS打开word97-2003后怎样打出空格方框和带勾方框? 空白方块怎样打 怎样在word中打出小方框 键盘怎样能打出长方形方框 求一篇高一的班级工作总结,从班长的角度写!急~~~ 高一第一学期结束了,该如何写教学工作总结和班主... 我是高一的班长,老师让写班级工作总结,该怎么写... 你们说这两个图片哪个做头像最真实 苹果手机如何双开? 如何做好高年级班主任管理工作总结 图片里的那个头像有情头吗,如果有,请发过来,谢... 人物全图片 为什么说「只有浅薄的人才不以貌取人」? 交朋友会以貌取人吗 如何避免以貌取人? 怎样把这张图片弄清晰 喜欢这样的图片做头像是一个戴眼镜的女孩吗 网名叫... 如何教育孩子不要以貌取人 班主任工作总结的书面实例 高一下学期班级期末总结 北方冬季取暖方法有哪些 冬天在北方用空调取暖效果如何?那个牌子的可靠,... 北方冬天用空调取暖能行吗 格力空调在北方冬天可以当暖气用吗