只要我们所有提交到线程池的任务,都用一个框架统一封装的 RunnableWrapper 类,基于装饰模式来进行包装。
此时就可以得到线程任务的创建时间、开始时间、结束时间,接着就可以计算出这个任务的排队耗时、运行耗时,通过监控系统进行上报。
此时我们通过在监控系统里配置告警条件,就可以实现不同线程池的每个任务的耗时指标上报,同时如果有某个线程池的某个线程排队耗时或者运行耗时超过了我们配置的阈值,就会自动告警。
// 线程任务包装类,用了装饰设计模式 public class RunnableWrapper implements Runnable { // 实际要执行的线程任务 private Runnable task; // 线程任务被创建出来的时间 private long createTime; // 线程任务被线程池运行的开始时间 private long startTime; // 线程任务被线程池运行的结束时间 private long endTime; // 当这个任务被创建出来的时候,就会设置他的创建时间 // 但是接下来有可能这个任务提交到线程池后,会进入线程池的队列排队 public RunnableWrapper(Runnable task){ this.task = task; this.createTime = new Date().getTime(); } // 当任务在线程池排队的时候,这个run方法是不会被运行的 // 但是当任务结束了排队,得到线程池运行机会的时候,这个方法会被调用 // 此时就可以设置线程任务的开始运行时间 public void run(){ this.startTime = new Date().getTime(); // 此处可以通过调用监控系统的API,实现监控指标上报 // 用线程任务的startTime-createTime,其实就是任务排队时间 // monitor.report("threadName", "queueWaitTime", startTime-createTime); // 接着可以调用包装的实际任务的run方法 task.run(); // 任务运行完毕以后,会设置任务运行结束的时间 this.endTIme = new Date().getTime(); // 此处可以通过调用监控系统的API,实现监控指标上报 // 用线程任务的endTime - startTime,其实就是任务运行时间 // monitor.report("threadName", "taskRunTime", endTime - startTime); } }
标签:编码,task,监控,任务,线程,startTime,运行 From: https://www.cnblogs.com/clarino/p/18385432