线程池 - 线程池监控
在使用线程池时出现问题,就需要定位处理,那么做个简单的线程池的监控还是必要的,起码可以在确认是线程池造成异常的时候查看下线程池的状态。
我在实际环境中遇到过类似问题,通知阻塞,造成业务延时,甚至部分通知直接未发送成功。学习并作简单记录。
目录
一、线程池的监控参数
1、activeCount 线程池中正在执行任务的线程数量
2、poolSize 线程池当前的线程数量
3、queueSize 还剩多少个任务未执行
4、largestPoolSize 线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过,也就是达到了maximumPoolSize
5、corePoolSize 线程池的核心线程数量
6、completedTaskCount 线程池已完成的任务数量,该值小于等于taskCount
7、maximumPoolSize 线程池的最大线程数量
8、taskCount 线程池已经执行的和未执行的任务总数
二、代码
package com.yuantiaokj.controller.internal;
import com.yuantiaokj.commonmodule.base.SysRes;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* ************************************************************
* Copyright © 2020 cnzz Inc.All rights reserved. * **
* ************************************************************
*
* @program: financial_eco-environment_cloud
* @description: 线程池监控
* @author: cnzz
* @create: 2020-11-25 08:55
**/
@RestController
@Slf4j
@Api(tags = "线程池监控")
@RequestMapping("/TaskExecutePoolMonitorController")
public class TaskExecutePoolMonitorController {
@Autowired
private Executor taskExecutePoolCnzz;
@ResponseBody
@PostMapping("/taskExecutePoolMonitor")
@ApiOperation("线程池监控")
public SysRes taskExecutePoolMonitor() {
log.info("TaskExecutePoolMonitor|线程池监控");
ThreadPoolTaskExecutor threadTask = (ThreadPoolTaskExecutor) taskExecutePoolCnzz;
ThreadPoolExecutor excutor = threadTask.getThreadPoolExecutor();
Map<String, Object> resultMap = getStringObjectMap(excutor);
return SysRes.success(resultMap);
}
private Map<String, Object> getStringObjectMap(ThreadPoolExecutor excutor) {
Map<String,Object> resultMap=new HashMap<>();
//线程池中正在执行任务的线程数量
int activeCount = excutor.getActiveCount();
resultMap.put("activeCount",activeCount);
log.info("{}|TaskExecutePoolMonitor|线程池中正在执行任务的线程数量", activeCount);
//线程池已完成的任务数量,该值小于等于taskCount
long completedTaskCount = excutor.getCompletedTaskCount();
resultMap.put("completedTaskCount",completedTaskCount);
log.info("{}|TaskExecutePoolMonitor|线程池已完成的任务数量,该值小于等于taskCount", completedTaskCount);
//线程池的核心线程数量
int corePoolSize = excutor.getCorePoolSize();
resultMap.put("corePoolSize",corePoolSize);
log.info("{}|TaskExecutePoolMonitor|线程池的核心线程数量", corePoolSize);
//线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过,也就是达到了maximumPoolSize
int largestPoolSize = excutor.getLargestPoolSize();
resultMap.put("largestPoolSize",largestPoolSize);
log.info("{}|TaskExecutePoolMonitor|线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过,也就是达到了maximumPoolSize", largestPoolSize);
//线程池的最大线程数量
int maximumPoolSize = excutor.getMaximumPoolSize();
resultMap.put("maximumPoolSize",maximumPoolSize);
log.info("{}|TaskExecutePoolMonitor|线程池的最大线程数量", maximumPoolSize);
//线程池当前的线程数量
int poolSize = excutor.getPoolSize();
resultMap.put("poolSize",poolSize);
log.info("{}|TaskExecutePoolMonitor|线程池当前的线程数量", poolSize);
//线程池已经执行的和未执行的任务总数
long taskCount = excutor.getTaskCount();
resultMap.put("taskCount",taskCount);
log.info("{}|TaskExecutePoolMonitor|线程池已经执行的和未执行的任务总数", taskCount);
//还剩多少个任务未执行
int queueSize = excutor.getQueue().size();
resultMap.put("queueSize",queueSize);
log.info("{}|TaskExecutePoolMonitor|还剩多少个任务未执行", queueSize);
return resultMap;
}
}
相关记录
自定义线程池 https://blog.youkuaiyun.com/xinpz/article/details/110139747
线程池参数及配置 https://blog.youkuaiyun.com/xinpz/article/details/110132365