java线程池参数_线程池参数的合理设置

java线程池参数_线程池参数的合理设置一:线程池参数简介#E*^.|0X*J(e,|4p!P,^6n-d’U/UThreadPoolExecutor类可设置的参数主要有:Y4~${7r*c.w7?corePoolSize:核心线程)o4N;k;j3w)f-J”^0v1.核心线程会一直存活,及时没有任务需要执行*I8V!t#[%e2.当线程数小于核心线程数时,即使有线程…

大家好,又见面了,我是你们的朋友全栈君。

一:线程池参数简介# E* ^. |0 X* J( e, |

4 p! P, ^6 n- d’ U/ UThreadPoolExecutor类可设置的参数主要有:Y4 ~$ {7 r* c. w7 ?

corePoolSize:核心线程

) o4 N; k; j3 w) f- J” ^0 v1.核心线程会一直存活,及时没有任务需要执行* I8 V! t# [% e

2.当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理% @# M  z4 Y2 R

3.设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭. ]6 Q, \( b% W

queueCapacity:任务队列容量(阻塞队列)

$ W6 `! U6 r4 E+ @* M5 c/ _# K# F8 e. n! D5 ]) ~% ~& q’ d  M. e

当核心线程数达到最大时,新任务会放在队列中排队等待执行

/ B1 `! {% z% L  F! UmaxPoolSize:最大线程数

8 j4 P$ T& u’ O& i! |6 I, [1.当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务7 O” r, j* `, [) k

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

) R$ [( I: O5 ^8 w. \$ ]keepAliveTime:线程空闲时间

‘ e$ Y’ @  U$ S% }1.当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize4 U! K. X  R) P! ?8 q, G

2.如果allowCoreThreadTimeout=true,则会直到线程数量=0

n3 F2 x( Z& }: irejectedExecutionHandler:任务拒绝处理器! t/ @: B$ ^$ ], E7 q, p

两种情况会拒绝处理任务:

6 r: n! _’ N’ P2 N: z1.当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务

* I; h9 t’ Q* s; X# w2.当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务。” u$ P) t- X0 w7 M# f

线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置,默认是AbortPolicy,会抛出异常。1 P3 u” G6 a* J

ThreadPoolExecutor类有几个内部实现类来处理拒绝任务:5 L# {0 ?9 m+ M6 \/ l2 Q

1.AbortPolicy 丢弃任务,抛运行时异常

‘ w6 f5 J9 Y+ `; n. }2 B2.CallerRunsPolicy 执行任务

. t: j7 c( q6 X# Q3.DiscardPolicy 忽视,什么都不会发生. q’ ~. _1 s. L) }1 T

4.DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务

, k9 J# E5 y5 m) L5.实现RejectedExecutionHandler接口,可自定义处理器, R9 `, C* C& Q0 X, ]3 p

二:ThreadPoolExecutor执行顺序:- v: Q$ V2 s8 |, k$ v$ B# G, b

, l4 S” Q, d7 J1 m1 j. g: L/ ]1.当线程数小于核心线程数时,创建线程。

+ @0 L* E: a9 _, `( h2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

. i* a# S5 M- s0 X” E/ C. P1 C  ^3.当线程数大于等于核心线程数,且任务队列已满4 z9 M6 k4 B2 d/ [- j- t3 Z4 E$ h

3.1若线程数小于最大线程数,创建线程

9 p. q’ f” X’ L1 W9 w2 U7 s+ u3.2若线程数等于最大线程数,抛出异常,拒绝任务” v8 f% J2 L7 F& l4 ~& _6 @

三:线程池参数的合理设置

4 r# [5 _5 S$ y2 ~$ n” L& y4 `9 _

$ g. O6 l& R) p+ T2 P为了说明合理设置的条件,我们首先确定有以下几个相关参数:# ~) z% c! E# ?1 ~1 d/ ^6 Z

1.tasks,程序每秒需要处理的最大任务数量(假设系统每秒任务数为100~1000)7 L( X’ k* o” Y0 q* ?) s; j& I

2.tasktime,单线程处理一个任务所需要的时间(每个任务耗时0.1秒)

# U1 X- D/ o# c3.responsetime,系统允许任务最大的响应时间(每个任务的响应时间不得超过2秒)

: `: v/ i( ~” J3 ^. G4 u4 qcorePoolSize

& k: b8 L+ `/ X% z1 e7 f% M. K’ ^: W3 p1 ?& ]: s5 j% ?

每个任务需要tasktime秒处理,则每个线程每钞可处理1/tasktime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:tasks/(1/tasktime),即taskstasktime个线程数。假设系统每秒任务数为100~1000,每个任务耗时0.1秒,则需要1000.1至10000.1,即10~100个线程。那么corePoolSize应该设置为大于10,具体数字最好根据8020原则,即80%情况下系统每秒任务数,若系统80%的情况下任务数小于200,最多时为1000,则corePoolSize可设置为20*。. y, _% B$ }, Y% f% h: |

queueCapacity:任务队列的长度

7 {9 L# J$ @) t5 M; c1 H2 e” b’ I& u6 j. C6 m, [

任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为(corePoolSize/tasktime)responsetime: (20/0.1)2=400,即队列长度可设置为400。, V: P  q& Z# I4 t

如果队列长度设置过大,会导致任务响应时间过长,如以下写法:

! E* i$ N+ g6 C5 Y- oLinkedBlockingQueue queue = new LinkedBlockingQueue();

3 ^/ p+ s1 h% z7 P” Y这实际上是将队列长度设置为Integer.MAX_VALUE,将会导致线程数量永远为corePoolSize,再也不会增加,当任务数量陡增时,任务响应时间也将随之陡增。

1 U’ J3 o8 l  _1 N% o5 R* mmaxPoolSize:最大线程数( ^, V% o; h* m9 s: M4 p

– u+ A0 m3 ?& G- r# C: _; f当系统负载达到最大值时,核心线程数已无法按时处理完所有任务,这时就需要增加线程。每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-queueCapacity)*(20/200),即60个线程,可将maxPoolSize设置为60。

– n; O7 o2 U3 V6 K9 K1 c4 g- |keepAliveTime:( C6 V” J# ^9 O  S! S

. X3 Q7 f7 j” F, `线程数量只增加不减少也不行。当负载降低时,可减少线程数量,如果一个线程空闲时间达到keepAliveTiime,该线程就退出。默认情况下线程池最少会保持corePoolSize个线程。keepAliveTiime设定值可根据任务峰值持续时间来设定。

, ]# q+ B9 P5 M, r’ a# Q以上关于线程数量的计算并没有考虑CPU的情况。若结合CPU的情况,比如,当线程数量达到50时,CPU达到100%,则将maxPoolSize设置为60也不合适,此时若系统负载长时间维持在每秒1000个任务,则超出线程池处理能力,应设法降低每个任务的处理时间(tasktime)。( L: Q! z/ S  ?2 N; M

ps:

. G4 }7 t! @  ^’ P+ r3 ^0 @. g

: N/ N+ @! N$ c’ ]5 T该文章创作原因来源于阿里java后端面试:

5 p, {/ f; R, R0 H如果给你8G内存,500G固态硬盘,双CPU四核的配置,现在有100个用户访问你的系统,请你设计一下你刚刚说的那些线程池参数。; v( r5 [- @; }8 R9 Z9 E

5 U; u1 L6 \5 ~% L

Java吧 java8 整理

9 @/ Y; c0 @3 ?* ]9 }. z9 [( y: KJava吧 收集整理 java8论坛 www.java8.com

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134876.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月6日 上午8:36
下一篇 2022年6月6日 上午8:36


相关推荐

  • 【低功耗蓝牙】⑤ 蓝牙HID协议

    【低功耗蓝牙】⑤ 蓝牙HID协议摘要本文章主要介绍了蓝牙 HID 协议的实现方法 基于 ESP32 平台实现了蓝牙键盘 蓝牙鼠标 蓝牙自拍杆和蓝牙游戏手柄等设备 是初学者学习 BLEHID 协议很好的参考文章 HID 设备 HID HumanInterfa 人体学接口设备 是生活中常见的输入设备 比如键盘鼠标游戏手柄等等 早期的 HID 是设备大部分都是通过 USB 接口来实现 蓝牙技术出现后 通过蓝牙作为传输层 实现了无线 HID 设备 通过低功耗蓝牙实现的 HID 功能一般简称为 HOGP HIDoverGattP

    2026年3月17日
    2
  • python基础知识思维导图总结

    python基础知识思维导图总结今天给同学用思维导图整理了python基础知识,供大家复习参考学习,希望每天都有进步。鸡汤几点:没有目标永远不知道方向在哪?不去尝试永远不知道答案和结果?打破习惯、冲击惯性思维、不断学习,才能使你越来越有价值。行动永远比坐以待毙更幸运。主要内容:一、Python简介二、输入输出三、变量、数据基本类型与操作四、条件判断五、常用数据类型–列表六、常用数据类型–元组tuple、字典dict(全称dictionary)七、常用数据类型–布尔值(True

    2022年10月16日
    5
  • 3.5使用RangeValidator控件

    3.5使用RangeValidator控件使用RangeValidator控件检测表单字段的值是否在指定的最小值和最大值之间五个属性:ControlToValidate—被验证的表单字段的IDText--验证失败时显示的错误信息MininumValueMaxinumValueType-比较类型:String,Integer,Double,Date和Currency默认为String[code…

    2022年7月14日
    17
  • sendgrid html text,用sendgrid发邮件

    sendgrid html text,用sendgrid发邮件sendgrid 是发送邮件的服务提供商 它提供两种发送邮件的方式 通过 smtp 或者他们自己专有的 API 来发送 我们用 go 来发送一个 首先下载 sendgrid go 软件包 通过 goget 命令来下载 getgetgithub com sendgrid sendgrid go 下载完后我们来看第一个例子 packagemaini fmt log os gi

    2026年3月19日
    3
  • Discord-TBAN-Bot:基于Discord的Roblox服务器自动化封禁与Trello任务同步机器人

    Discord-TBAN-Bot:基于Discord的Roblox服务器自动化封禁与Trello任务同步机器人

    2026年3月12日
    3
  • python3.9多线程_python多线程原理

    python3.9多线程_python多线程原理什么是线程?线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其

    2022年8月6日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号