一、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执行顺序:
线程池按以下行为执行任务

当线程数小于核心线程数时,创建线程。
当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
当线程数大于等于核心线程数,且任务队列已满
若线程数小于最大线程数,创建线程
若线程数等于最大线程数,抛出异常,拒绝任务

三、如何设置参数

默认值
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采用默认通常能满足

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

参考:
http://blog.csdn.net/zhouhl_cn/article/details/7392607
http://my.oschina.net/u/169390/blog/97415

ThreadPoolExecutor线程池参数设置相关推荐

  1. java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?

    线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧! 首先在设置参数的时候,有以下的几点是我们需要考虑到的! ...

  2. 【并发编程】线程池参数设置与动态调整

    看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节. 一.场景分析 1.1 一个线程池中的线程异常了,那么线程池会怎么处理这个线程? public class ThreadPoolExecu ...

  3. python3 ThreadPoolExecutor 线程池大小设置

    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性.线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能 ...

  4. matlab 设置最大并行数_浅析线程池参数设置

    背景 首先先明确一下线程池的主要作用是什么 线程池解决的核心问题就是资源管理问题.在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入.这种不确定性将带来以下若干问题: 频 ...

  5. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  6. 从原理上搞懂如何设置线程池参数大小?

    我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢? 其实线程池的设置 ...

  7. 线程池参数如何设置?

    前言 着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发 ...

  8. ThreadPoolExecutor线程池核心参数详解

    理解ThreadPoolExecutor线程池的corePoolSize.maximumPoolSize和poolSize 我们知道,受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,因为 ...

  9. 线程池参数的合理设置

    一:线程池参数简介 ThreadPoolExecutor类可设置的参数主要有: corePoolSize:核心线程 1.核心线程会一直存活,及时没有任务需要执行 2.当线程数小于核心线程数时,即使有线 ...

最新文章

  1. android audiotrack使用问题:listener不回调的原因
  2. 日期时间类,按特定格式显示日期时间
  3. sqlite3x library
  4. java 大数类_Java大数类介绍
  5. visio中给文字添加上下标
  6. android The public type classname must be defined in its own file 报错
  7. php 检测函数是否为对象,php如何查看对象方法
  8. java 内存快照怎么看_jvm工具篇-(1)-分析工具MAT使用(内存快照分析)
  9. 在windows下使用cmd命令行对java文件进行编译和执行
  10. SPSS可以生成正交表吗?
  11. Web前端实战:管理系统网页的初步设计
  12. python 爬取句子迷,多好的一个网站(哭~~)
  13. mysql新增一个常数列_添加常数列
  14. cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)
  15. 微信小程序实现押金管理(支付押金、申请退还押金、押金明细)
  16. 聊城大学计算机学院2016级11班,E·社会实践 | “观运河风采,忆聊城古韵”——2016级11班...
  17. 可能是全网最详细的python安装教程(windows),小白建议收藏
  18. 车祸相关公开数据集(免费下载)
  19. 全志T507核心板4路AHD摄像头实现方案-飞凌嵌入式
  20. 超全的 Vue 开源项目合集

热门文章

  1. mp4 转 jpg 图片
  2. Jquery 图片轮播实现原理总结
  3. i9 10900k和i9 9900k参数对比提升多少
  4. PHP写portal认证服务器,搭建自己的wifidog认证服务器
  5. 被勒索病毒攻击后,有没有必要做溯源分析?
  6. WinForm DataGridView制作表格
  7. 3D游戏建模篇——教你使用3Dmax制作绝地求生“塔楼”
  8. SPI Core 寄存器简介
  9. 自媒体运营技巧:趣头条如何赚钱?
  10. Oracle数据库安装