java线程池最大线程数-java线程池大小
关于Java线程池的参数设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。
1.威胁
关于Java线程池的参数
关于Java线程池的参数设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。
一、ThreadPoolExecutor的重要参数
1.corePoolSize:核心线程数
* 核心线程会一直存活,即使没有任务可执行
* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理
* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
2.queueCapacity:任务队列容量(阻塞队列)
* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行
3. maxPoolSize:最大线程数
* 当线程数>=corePoolSize,任务队列已满时java线程池最大线程数,线程池创建新的线程处理任务
* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常
4.keepAliveTime:线程空闲时间
* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize
* 如果allowCoreThreadTimeout=true,直到线程数=0
5. allowCoreThreadTimeout:允许核心线程超时
6.rejectedExecutionHandler:任务拒绝处理程序
* 两种情况会拒绝处理任务:
- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝
- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝
* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常
* ThreadPoolExecutor类内部有几个实现类来处理此类情况:
- AbortPolicy 丢弃任务并抛出运行时异常
- CallerRunsPolicy 执行任务
- 忽略 DiscardPolicy,没有任何反应
- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务
* 实现RejectedExecutionHandler接口,可以自定义处理器
二、ThreadPoolExecutor执行顺序
线程池根据以下行为执行任务
1、当线程数小于核心线程数时,创建线程。
2.当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,任务队列满时
- 如果线程数小于最大线程数,创建一个线程
- 如果线程数等于最大线程数,则抛出异常并拒绝任务
3.如何设置参数
1.默认值
* 核心池大小=1
* queueCapacity=Integer.MAX_VALUE
* maxPoolSize=Integer.MAX_VALUE
* keepAliveTime=60s
* allowCoreThreadTimeout=false
* rejectedExecutionHandler=AbortPolicy()
2.如何设置
* 需要根据几个值来决定
- 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 通常默认满足
3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。
设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。
一、ThreadPoolExecutor的重要参数
1.corePoolSize:核心线程数
* 核心线程会一直存活,即使没有任务可执行
* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理
* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
2.queueCapacity:任务队列容量(阻塞队列)
* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行
3. maxPoolSize:最大线程数
* 当线程数>=corePoolSize,任务队列已满时,线程池创建新的线程处理任务
* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常
4.keepAliveTime:线程空闲时间
* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize
* 如果allowCoreThreadTimeout=true,直到线程数=0
5. allowCoreThreadTimeout:允许核心线程超时
6.rejectedExecutionHandler:任务拒绝处理程序
* 两种情况会拒绝处理任务:
- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝
- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝
* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常
* ThreadPoolExecutor类内部有几个实现类来处理此类情况:
- AbortPolicy 丢弃任务并抛出运行时异常
- CallerRunsPolicy 执行任务
- 忽略 DiscardPolicy,没有任何反应
- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务
* 实现RejectedExecutionHandler接口,可以自定义处理器
二、ThreadPoolExecutor执行顺序
线程池根据以下行为执行任务
1、当线程数小于核心线程数时,创建线程。
2.当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,任务队列满时
- 如果线程数小于最大线程数,创建一个线程
- 如果线程数等于最大线程数,则抛出异常并拒绝任务
3.如何设置参数
1. 默认值
* 核心池大小=1
* queueCapacity=Integer.MAX_VALUE
* maxPoolSize=Integer.MAX_VALUE
* keepAliveTime=60s
* allowCoreThreadTimeout=false
* rejectedExecutionHandler=AbortPolicy()
2.如何设置
* 需要根据几个值来决定
- 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 通常默认满足
3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。
dPoolExecutor 重要参数
1.corePoolSize:核心线程数
* 核心线程会一直存活,即使没有任务可执行
* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理
* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
2.queueCapacity:任务队列容量(阻塞队列)
* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行
3. maxPoolSize:最大线程数
* 当线程数>=corePoolSize,任务队列已满时,线程池创建新的线程处理任务
* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常
4.keepAliveTime:线程空闲时间
* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize
* 如果allowCoreThreadTimeout=true,直到线程数=0
5. allowCoreThreadTimeout:允许核心线程超时
6.rejectedExecutionHandler:任务拒绝处理程序
* 两种情况会拒绝处理任务:
- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝
- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝
* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常
* ThreadPoolExecutor类内部有几个实现类来处理此类情况:
- AbortPolicy 丢弃任务并抛出运行时异常
- CallerRunsPolicy 执行任务
- 忽略 DiscardPolicy,没有任何反应
- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务
* 实现RejectedExecutionHandler接口,可以自定义处理器
二、ThreadPoolExecutor执行顺序
线程池根据以下行为执行任务
1、当线程数小于核心线程数时,创建线程。
2、当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,任务队列满时
- 如果线程数小于最大线程数,创建一个线程
- 如果线程数等于最大线程数java线程池最大线程数,则抛出异常并拒绝任务
3.如何设置参数
1.默认值
* 核心池大小=1
* queueCapacity=Integer.MAX_VALUE
* maxPoolSize=Integer.MAX_VALUE
* keepAliveTime=60s
* allowCoreThreadTimeout=false
* rejectedExecutionHandler=AbortPolicy()
2.如何设置
* 需要根据几个值来决定
- 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 通常默认满足
3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。