线程池队列大小设置

JAVA线程池 并发队列工作笔记0002 认识线程池 在线程池中使用队列

本篇文章给大家谈谈线程池队列大小设置,以及线程池不建议队列对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

  1. 线程池存活时间设置多久比较好
  2. 线程池与mq的区别
  3. 线程池队列大小设置
  4. disruptor框架和线程池有什么区别

线程池存活时间设置多久比较好

设置60秒比较好,keepAliveTime(线程存活保持时间)作用:当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。

线程池与mq的区别

mq是消息队列的英文缩写,线程池是为方便多线程编程构建的组件。

线程池队列大小设置

一、ThreadPoolExecutor的重要参数

corePoolSize:核心线程数,核心线程会一直存活,及时没有任务需要执行,当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理,设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

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

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

maxPoolSize:最大线程数

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

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

keepAliveTime:线程空闲时间

当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize

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

allowCoreThreadTimeout:允许核心线程超时

rejectedExecutionHandler:任务拒绝处理器

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

当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务

当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务

线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常

ThreadPoolExecutor类有几个内部实现类来处理这类情况:

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

CallerRunsPolicy执行任务

DiscardPolicy忽视,什么都不会发生

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

实现RejectedExecutionHandler接口,可自定义处理器

二、ThreadPoolExecutor执行顺序

线程池按以下行为执行任务

(1)当线程数小于核心线程数时,创建线程。

(2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

(3)当线程数大于等于核心线程数,且任务队列已满

1)若线程数小于最大线程数,创建线程

2)若线程数等于最大线程数,抛出异常,拒绝任务

三、如何设置参数

默认值

corePoolSize=1

queueCapacity=Integer.MAX_VALUE

maxPoolSize=Integer.MAX_VALUE

keepAliveTime=60s

allowCoreThreadTimeout=false

rejectedExecutionHandler=AbortPolicy()

如何来设置

需要根据几个值来决定

tasks:每秒的任务数,假设为500~1000

taskcost:每个任务花费时间,假设为0.1s

responsetime:系统允许容忍的最大响应时间,假设为1s

做几个计算

corePoolSize=每秒需要多少个线程处理?

threadcount=tasks/(1/taskcost)=tasks*taskcout=(500~1000)*0.1=50~100个线程。corePoolSize设置应该大于50

根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可

queueCapacity=(coreSizePool/taskcost)*responsetime

计算可得queueCapacity=80/0.1*1=80。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行

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

maxPoolSize=(max(tasks)-queueCapacity)/(1/taskcost)

计算可得maxPoolSize=(1000-80)/10=92

(最大任务数-队列容量)/每个线程每秒处理能力=最大线程数

rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理

keepAliveTime和allowCoreThreadTimeout采用默认通常能满足

以上都是理想值,实际情况下要根据机器性能来决定。如果在未达到最大线程数的情况机器cpuload已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。

disruptor框架和线程池有什么区别

Disruptor框架是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

线程池队列大小设置和线程池不建议队列的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

JAVA线程池 并发队列工作笔记0002 认识线程池 在线程池中使用队列

本文内容来自互联网,若需转载请注明:https://bk.66688891.com/12/92814.html