如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用状态快速定位问题。可以根据线程池提供的参数进行监控,常用属性如下:
taskCount:线程池需要执行的任务数量
completedTaskCount:已完成的任务数量
largestPoolSize:线程池曾经创建过的最大线程数量,可以推测出是否达到corePoolSize和MaxinumPoolSize
getPoolSize:线程池的线程数量,只要不销毁,只增不减
getActiveCount:活动的线程总数
接下来展示的通过扩展线程池的方式监控状态:
1、继承线程池,重写beforeExecute、afterExecute、temninate等方法
package com.fc.provider;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 自定义线程池
*
* @author fc on 2018/4/27.
*/
public class ThreadPoolExecutorDef extends ThreadPoolExecutor {
/**
* 重写构造方法
*
* @param corePoolSize 核心线程数量
* @param maximumPoolSize 最大线程数量
* @param keepAliveTime 非核心线程闲置存活时间
* @param unit 时间单位
* @param workQueue 工作队列
* @param threadFactory 线程工厂
* @param handler 拒绝策略
*/
public ThreadPoolExecutorDef(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit,
BlockingQueue<