在日常项目开发中,我们经常会遇到需要异步处理的任务,例如日志服务,监控服务等。有一定开发经验的同学首先就会想到使用线程池,因为“在线程池中执行任务”比“为每个任务创建一个线程”更有优势,通过重用现有的线程,可以避免线程在不断创建、销毁过程中产生的开销。在java开发中,一般做法就是基于ThreadPoolExecutor类,自定义corePoolSize, maxPoolSize, ThreadFactory等参数来创建一个线程池工具类。但是,线程池也不是没有缺点的,对于开发者而言,我们很难在项目上线之前准确地预估业务的规模,所以,如何合理地为线程池设置corePoolSize,maxPoolSize是一个比较难把握的事情,设置不合理会导致不能达到预计的性能,甚至会引发线上故障。不过,利用ThreadPoolExecutor为我们提供的一些监控api,我们可以做到对线程池进行实时监控和调优。本文将利用如下几个API,并结合Cat提供的拓展功能,实现对线程池的持续监控。
1.自定义线程池
如下代码是我用来测试的一个线程池工具类
public class ThreadPoolManager<T> {
/**
* 根据cpu的数量动态的配置核心线程数和最大线程数
*/
//private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
/**
* 核心线程数 =