ThreadPoolExecutor几点使用建议

  • 时间:
  • 浏览:1
  • 来源:5分快乐8APP下载_5分快乐8APP官方

  *  这里的corePoolSize而且连接池的maxActive的概念,它那么minIdle的概念(每个任务管理器能不需要 设置keepAliveTime,超不多少时间多有任务后销毁任务管理器,默认只会针对maximumPoolSize参数的任务管理器生效,能不需要 设置allowCoreThreadTimeOut=true,就能不需要 对corePoolSize进行idle回收)。 

将那我串行的请求都变为了并行操作,但不多的并行会增加系统的负载(比如软中断,上下文切换)。不多 肯定还要对任务管理器池做另另一有一个 多size限制。而且为了引入异步操作后,避免因在block queue的等候时间过长,不多 还要在队列满的时,执行另另一有一个 多callsRun的策略,并行的操作又转为另另一有一个 多串行避免,那我就能不需要 保证尽量少的延迟影响。

整个ThreadPoolExecutor的任务避免有4步操作:

不多 建议: block size >= corePoolSize ,不然任务管理器池就没任何意义

1.  pool threads启动后,并且的任务获取都是通过block queue中,获取堆积的runnable task.

  * 这里的maximumPoolSize,是你是什么救急妙招的第一层。当threadPoolExecutor的工作threads发生满负荷,而且block queue队列也满了,这时代表接近崩溃边缘。这时允许临时起一批threads,用来避免runnable,避免并且通过keepAliveTime进行调度回收。

1. poolSize 代表为当前的任务管理器数

先看一副图,描述了ThreadPoolExecutor的工作机制: 

容易被人忽略的点:

几点说明:(相信什么网上一搜一大把,我这里简单介绍下,为后边做一下铺垫)

2. largestPoolSize 代表为历史最大的任务管理器数

不多 建议:  RejectExecutionHandler = CallsRun ,  blockqueue size = 2 * poolSize (缘何是2倍poolSize,主要另另一有一个 多考虑而且瞬间高峰避免,允许另另一有一个 多thread等候另另一有一个 多runnable任务)

运行结果:

  这是我对ThreadPoolExecutor使用过程中的你你是什么 经验总结,希望能对当我们我们我们我们我们我们 有所帮助,如有描述不对的地方欢迎拍砖。

3. queueSize 代表blockqueue的当前堆积的size

2.  corePoolSize 和 maximumPoolSize的区别, 和当我们我们我们我们我们我们 正常理解的数据库连接池不太一样。

不多 建议:  maximumPoolSize >= corePoolSize =期望的最大任务管理器数。 (我那我配置了corePoolSize=1, maximumPoolSize=20, blockqueue为无界队列,最后就成了单任务管理器工作的pool。典型的配置错误)

说明:

再提供另另一有一个 多btrace脚本,分析线上的thread pool容量规划不是合理,能不需要 运行时输出poolSize等你你是什么 数据。

当我们我们我们我们我们我们 总是会在线上使用你你是什么 任务管理器池做异步避免,比如我前面做的

3. 善用blockqueue和reject组合. 这里要重点推荐下CallsRun的Rejected Handler,从字面意思而且让调用者当时人来运行。

4. reject count 代表在10000ms内的被reject的数量

前段时间另另一有一个 多项目中而且涉及大量的任务管理器开发,把jdk cocurrent的代码重新再过了一遍。这篇文章中主而且记录一下学习ThreadPoolExecutor过程中容易被人忽略的点,Doug Lea的整个类设计还是非常nice的

  *  据dbcp pool为例,会有minIdle , maxActive配置。minIdle代表是常驻内存中的threads数量,maxActive代表是工作的最大任务管理器数。