java线程池参数及合理设置

java线程池参数及合理设置
线程池的7大核心参数
corePoolSize
核心线程数目核心线程会一直存活,及时没有任务需要执行,当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
maximumPoolSize 最大线程数目
当空闲线程时间达到 keepAliveTime,线程会关闭,直到数量等于corePoolSize
keepAliveTime空闲时间
unit 时间单位
超过核心线程的生存时间单位,如秒、毫秒等。
workQueue 阻塞队列
LinkedBlockingQueue:无界队列,容量Integer.MAX_VALUE,(FixedThreadPool 和 SingleThreadExecutor 线程池的线程数是固定的,用的就是LinkedBlockingQueue
SynchronousQueue:直接提交的任务队列(CachedThreadPool 的最大线程数是 Integer.MAX_VALUE,用的是SynchronousQueue)
ArrayBlockingQueue:指定队列大小(corePoolSize >队列>maximumPoolSize )
threadFactory 线程工厂
可以定制线程对象的创建,例如设置线程名字、是否是守护线程等。
handler 拒绝策略
一个类型为RejectedExecutionException 的 RuntimeException异常AbortPolicy:终止策略。超过最大承载、执行拒绝任务时,会直接抛出
CallerRunsPolicy:调用者执行策略。超过承载,执行策略时,调用者线程执行任务。
DiscardOldestPolicy:丢弃最早任务策略。超过承载,丢弃队列中最早的任务。若线程池关闭,则舍弃。
DiscardPolicy:丢弃策略。超过承载,丢弃任务。
实现RejectedExecutionHandler接口,自定义策略
线程池参数的合理设置
tasks,程序每秒需要处理的最大任务数量
tasktime,单线程处理一个任务所需要的时间
responsetime,系统允许任务最大的响应时间

corePoolSize
每个任务需要tasktime秒处理,则每个线程每秒可处理1/tasktime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:tasks/(1/tasktime)。即tasks*tasktime个线程数。具体数字最好根据8020原则,即80%情况下系统每秒任务数。
queueCapacity:任务队列的长度
任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为(corePoolSize/tasktime)responsetime
maxPoolSize:最大线程数
当系统负载达到最大值时,核心线程数已无法按时处理完所有任务,这时就需要增加线程。每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-queueCapacity)*(20/200)。
keepAliveTime
keepAliveTiime设定值可根据任务峰值持续时间来设定。
以上关于线程数量的计算并没有考虑CPU的情况。若结合CPU的情况,比如,当线程数量达到50时,CPU达到100%,则将maxPoolSize设置为60也不合适,此时若系统负载长时间维持在每秒1000个任务,则超出线程池处理能力,应设法降低每个任务的处理时间(tasktime)。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Java线程池参数配置,可以根据实际需求来确定。以下是一些常见的参数及其推荐配置: 1. 核心线程数(corePoolSize):表示线程池中保持活动状态的线程数量。根据系统的负载情况和处理任务的类型来决定,一般推荐设置为CPU核心数的2倍。 2. 最大线程数(maximumPoolSize):表示线程池允许创建的最大线程数量。根据系统负载和可用资源来决定,一般推荐设置为CPU核心数的2倍或者更大。 3. 空闲线程存活时间(keepAliveTime):表示当线程池中线程数量超过核心线程数时,空闲线程的存活时间。可以根据任务类型和系统负载来调整。如果任务较多且任务执行时间较长,可以适当增大该值。 4. 阻塞队列(workQueue):用于存储等待执行的任务的队列。常见的队列类型有无界队列(如LinkedBlockingQueue)和有界队列(如ArrayBlockingQueue)。根据应用场景和系统负载来选择合适的队列类型。 5. 拒绝策略(rejectedExecutionHandler):表示当任务无法被提交给线程池时的处理策略。例如,默认的ThreadPoolExecutor.AbortPolicy会抛出RejectedExecutionException异常,而ThreadPoolExecutor.CallerRunsPolicy会在提交任务的线程中执行该任务。根据业务需求和系统特点选择合适的拒绝策略。 需要注意的是,线程池参数的配置需要根据具体的业务场景和系统负载来进行调整,以达到最佳性能和资源利用的平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值