
图20 setCorePoolSize方法执行流程
线程池内部会处理好当前状态做到平滑修改 , 其他几个方法限于篇幅 , 这里不一一介绍 。重点是基于这几个public方法 , 我们只需要维护ThreadPoolExecutor的实例 , 并且在需要修改的时候拿到实例修改其参数即可 。基于以上的思路 , 我们实现了线程池参数的动态化、线程池参数在管理平台可配置可修改 , 其效果图如下图所示:

图21 可动态修改线程池参数
用户可以在管理平台上通过线程池的名字找到指定的线程池 , 然后对其参数进行修改 , 保存后会实时生效 。目前支持的动态参数包括核心数、最大值、队列长度等 。除此之外 , 在界面中 , 我们还能看到用户可以配置是否开启告警、队列等待任务告警阈值、活跃度告警等等 。关于监控和告警 , 我们下面一节会对齐进行介绍 。
线程池监控
除了参数动态化之外 , 为了更好地使用线程池 , 我们需要对线程池的运行状况有感知 , 比如当前线程池的负载是怎么样的?分配的资源够不够用?任务的执行情况是怎么样的?是长任务还是短任务?
基于对这些问题的思考 , 动态化线程池提供了多个维度的监控和告警能力 , 包括:线程池活跃度、任务的执行Transaction(频率、耗时)、Reject异常、线程池内部统计信息等等 , 既能帮助用户从多个维度分析线程池的使用情况 , 又能在出现问题第一时间通知到用户 , 从而避免故障或加速故障恢复 。
1. 负载监控和告警
线程池负载关注的核心问题是:基于当前线程池参数分配的资源够不够 。对于这个问题 , 我们可以从事前和事中两个角度来看 。事前 , 线程池定义了“活跃度”这个概念 , 来让用户在发生Reject异常之前能够感知线程池负载问题 , 线程池活跃度计算公式为:线程池活跃度 =
activeCount/maximumPoolSize 。这个公式代表当活跃线程数趋向于maximumPoolSize的时候 , 代表线程负载趋高 。
事中 , 也可以从两方面来看线程池的过载判定条件 , 一个是发生了Reject异常 , 一个是队列中有等待任务(支持定制阈值) 。以上两种情况发生了都会触发告警 , 告警信息会通过大象推送给服务所关联的负责人 。

图22 大象告警通知
2. 任务级精细化监控
在传统的线程池应用场景中 , 线程池中的任务执行情况对于用户来说是透明的 。比如在一个具体的业务场景中 , 业务开发申请了一个线程池同时用于执行两种任务 , 一个是发消息任务、一个是发短信任务 , 这两类任务实际执行的频率和时长对于用户来说没有一个直观的感受 , 很可能这两类任务不适合共享一个线程池 , 但是由于用户无法感知 , 因此也无从优化 。动态化线程池内部实现了任务级别的埋点 , 且允许为不同的业务任务指定具有业务含义的名称 , 线程池内部基于这个名称做Transaction打点 , 基于这个功能 , 用户可以看到线程池内部任务级别的执行情况 , 且区分业务 , 任务监控示意图如下图所示:
推荐阅读
- cad卸载工具怎么用 cad卸载干净的教程
- qq营销工具源码 最有效推广的方式
- 目前三防手机哪个好 最好的三防手机品牌
- 哪些人不宜喝酒
- 艾灸真的可以治疗哮喘吗
- 面包硬的其他原因
- 钓鲈鱼的饵料比较好用的有哪些
- 黄皮果的食用方法
- 骨盆前倾该怎么练呢
- 骨盆前倾是怎么形成的呢
