线程池参数配置

线程池参数配置,第1张

corePoolSize:线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。

maximumPoolSize:线程池所能容纳的最大线程数。当活动线程(核心线程+非核心线程)达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。

keepAliveTime:非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通过 allowCoreThreadTimeOut() 方法设置 allowCoreThreadTimeOut 属性为 true,则该时长同样会作用于核心线程。

workQueue:任务队列,当核心线程达到最大值,新请求的任务将放在这里;

RejectedExecutionHandler:当任务无法被执行时(超过线程最大容量 maximum 并且 workQueue 已经被排满了)的处理策略,这里有四种任务拒绝类型。

1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。

2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中,随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从workQueue 中取任务并处理。

3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。

4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。

CPU密集型核心线程数=CPU核数+1;

IO密集型核心线程数=CPU核数*2;

最大线程数= CPU 核心数 / (1 - 阻塞系数)

其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。比如 8 核 CPU,按照公式就是 2 / ( 1 - 0.9 ) = 20 个线程数

当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。

当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。

切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。

如果是连接SqlServer,那么在连接串里可以配置连接池大小, 在连接字符串中指定。如 MaxPoolSize=50,MinPoolSize=0, MaxPoolSize默认是100,MinPoolSize默认是0,如: "server=127.0.0.1database=test1UID=saPwd=123456MaxPoolSize=50"

1、同步开发模式下,根据业务接口调整默认工作线程,默认为CPU个数

thread-per-group: 200

2、同步开发模式下,根据业务需要,动态调整thread-count,默认为1,一般建议配置成cpu*2

thread-count: 8

3、根据接口时延,调整Http连接池大小,但是不建议连接数配置过大。按经验不要超过50,最好是进行压力测试得出一个比较合理的值。

maxPoolSize: 10

4、同步开发转成全异步开发模式,参考CSE开发文档Reactive

5、调整虚拟机启动参数

6、如果使用Https连接,建议使用openssl作为SSLEngine

ssl:

engine: openssl


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

原文地址: https://outofmemory.cn/tougao/11304928.html

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

发表评论

登录后才能评论

评论列表(0条)

保存