spring中的线程池
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中的线程池相关的知识,希望对你有一定的参考价值。
参考技术Aorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 是spring提供的线程池类
拒绝策略:
AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
执行过程:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maxPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maxPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
核心线程数设置参考:
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
什么是CPU密集型?什么是IO密集型?
https://blog.csdn.net/youanyyou/article/details/78990156
CPU密集型也叫计算密集型,计算密集型任务的特点是要进行大量的计算,消耗CPU资源,这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。
参考:
https://blog.csdn.net/weixin_43168010/article/details/97613895
https://www.cnblogs.com/redcool/p/6426173.html
https://blog.csdn.net/lifulian318/article/details/109000675
补充:拒绝策略使用场景和其他第三方拒绝策略,参考: https://blog.csdn.net/zj57356498318/article/details/102579980
关于spring mvc 请求参数校验使用中的坑 。 maven 生命周期,线程池杂识
//一、使用@Valid @NotNull 启动项目请求,参数为空, // 好像没有效果。原因是只加了jar包:javax.validation:validation-api,这个包是一个规范,并没有实现 // spring 的默认实现是 org.hibernate:hibernate-validator 加上即可。 // 再次请求 返回400, //看日志是校验未通过,接下来就是校验异常后处理了。使用以下代码处理 @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) public String bindException(MethodArgumentNotValidException e) QrResponse res = new QrResponse(); res.setBack("中文"); String result = JSON.toJSONString(res); return result;//(本项目是返回json字符串) //不在显示400异常stack了。 //然而仔细看返回的json ,发现出现了乱码 //二、网上一查全是说@Notnull等的提示信息乱码 //@NotNull等注解是可以自定义提示信息的,都是说这个提示信息乱码怎么解决。 //我并不关心提示信息,整了半天,最后clean了重新打包好了 //三、自定义校验 public class ScanValidator implements ConstraintValidator<ScanAnnotation,ADTO> //ScanAnnotation 自定义注解,可以放到类上,属性上,仿@notnull //ADTO 需要校验的类或属性 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Constraint(validatedBy = ScanValidator.class) //这句别忘了 public @interface ScanAnnotation
$# 表示传入脚本的参数 2. grep -a xx 筛选文件内容(解决报错binary 问题) grep -C num 显示搜索内容的前后num行 -v 反向查询 -i 忽略大小写 3. 自定义命令 alias cdl=‘cd /home/wtposp/logs/‘ alias cdc=‘cd /var/www/pro/transaction_agent/current/transaction_agent/WEB-INF/classes/‘ alias cdt=‘cd /var/www/apps/transaction_agent/java/apache-tomcat-8.5.24/bin‘ 永久生效: 修改~/.bashrc 文件,source ~/.bashrc 4. 切换用户 : sudo su 切换到root , su username 切换到普通用户,exit 即可回到root 用户。 【其他】 1. solid原则:单一,开闭,里氏,接口,依赖倒置,迪米特。 2. win + shift + s win系统自带【截图工具】,截图后点击后上角复制即可复制。 3. alt + A 微信自带截图工具 4. xshell 快捷键 ctrl +w 删除光标前一个单词,ctrl+u 删除光标前所有单词 , crtl+Y 撤销删除 5. maven生命周期有三个: 默认default , clean 和 site . 常用的clean 和 install(默认生命周期)不在一个生命周期里(重点)。 所以不要以为install会自动执行clean(尤其在你删除了文件后,不clean,直接install可能会发现删除的文件还在包里,晕). install 对应的default 生命周期为: validate,compile,test,package,verify,install,deploy 6. 如果excel不能编辑,可以先打开word,再重新打开excel 即可编辑。 7. ThreadPoolExecutor.submit() 可以返回的含义:其实是sumbit方法内部将线程包装成futureTask,仍然调用的是execute()方法,然后返回包装后的可以通过 的futureTask 而不是说submit直接返回线程执行结果。 用户如需获取线程返回值,可以通过futureTask.get()方法阻塞线程等待线程返回。
以上是关于spring中的线程池的主要内容,如果未能解决你的问题,请参考以下文章