Java耗时打印工具类
使用ThreadLocal配合StopWatch简化代码耗时打印的代码量。
工具类提供StopWatch默认输出格式和支持自定义打印输出格式,具体代码如下:
import org.springframework.util.StopWatch;import lombok.extern.slf4j.Slf4j;/*** 使用线程变量全局打印耗时* * @author jun.chen**/
@Slf4j
public class CostPrintUtil {private static final ThreadLocal<StopWatch> stopWatchLocal = new ThreadLocal<>();/*** 初始化StopWatch* * @param title*/public static void init(String title) {initStopWatch(title);}/*** 开始记录某段代码的耗时* * @param taskName*/public static void startWatch(String taskName) {StopWatch stopWatch = getStopWatch();if (stopWatch.isRunning()) {stopWatch.stop();log.debug("{} is Running,stop it.", stopWatch.getLastTaskName());}stopWatch.start(taskName);}/*** 结束记录* * @param taskName*/public static void stopWatch() {StopWatch stopWatch = getStopWatch();if (stopWatch.isRunning()) {stopWatch.stop();} else {log.debug("stopWatch is not start.");}}/*** 结束StopWatch并StopWatch对象* * @return*/public static StopWatch end() {StopWatch stopWatch = getStopWatch(true);if (null == stopWatch) {throw new RuntimeException("当前线程内没有StopWatch对象.");}if (stopWatch.isRunning()) {stopWatch.stop();log.debug("{} is Runnong,stop it.", stopWatch.getLastTaskName());}clearStopWatch();return stopWatch;}/*** 结束并打印 默认使用stopWatch.prettyPrint()* */public static void endPrint() {endPrint(null);}/*** 结束并打印* * @param helper*/public static void endPrint(PrintHelper helper) {StopWatch stopWatch = end();if (null != helper) {helper.print(stopWatch);} else {log.info(stopWatch.prettyPrint());}}/*** 自定义打印输出* * @author jun.chen**/interface PrintHelper {void print(StopWatch stopWatch);}private static void initStopWatch(String title) {stopWatchLocal.set(new StopWatch(title));}private static StopWatch getStopWatch() {return getStopWatch(false);}private static StopWatch getStopWatch(boolean isEnd) {return getStopWatch("", isEnd);}/*** 获取当前线程内的StopWatch* * @param title* @param isEnd* @return*/private static StopWatch getStopWatch(String title, boolean isEnd) {StopWatch stopWatch = stopWatchLocal.get();// 非结束时获取StopWatch允许初始化if (null == stopWatch && !isEnd) {initStopWatch(title);}return stopWatchLocal.get();}private static void clearStopWatch() {stopWatchLocal.remove();}public static void main(String[] args) throws InterruptedException {// a. 正常使用CostPrintUtil.init("示例A");CostPrintUtil.startWatch("TaskA - 1");Thread.sleep(200);CostPrintUtil.stopWatch();CostPrintUtil.startWatch("TaskA - 2");Thread.sleep(300);CostPrintUtil.stopWatch();CostPrintUtil.startWatch("TaskA - 3");Thread.sleep(100);CostPrintUtil.stopWatch();CostPrintUtil.endPrint();// b. 未初始化直接startCostPrintUtil.startWatch("TaskB - 1");Thread.sleep(200);CostPrintUtil.stopWatch();CostPrintUtil.endPrint();// c. 未stop直接endCostPrintUtil.startWatch("TaskC - 1");Thread.sleep(200);CostPrintUtil.endPrint();// d. 多次endCostPrintUtil.startWatch("TaskD - 1");Thread.sleep(200);CostPrintUtil.endPrint();try {CostPrintUtil.endPrint();} catch (Exception e) {log.error(e.getMessage());}// e.多次start 和 多次stopCostPrintUtil.startWatch("TaskE - 1");Thread.sleep(200);CostPrintUtil.startWatch("TaskE - 2");Thread.sleep(200);CostPrintUtil.stopWatch();CostPrintUtil.stopWatch();CostPrintUtil.endPrint();// f. 自定义打印输出CostPrintUtil.startWatch("自定义打印耗时(重写接口实现)");Thread.sleep(200);CostPrintUtil.stopWatch();// 重写接口实现CostPrintUtil.endPrint(new PrintHelper() {@Overridepublic void print(StopWatch stopWatch) {log.info("TaskName:{} Cost:{}", stopWatch.getLastTaskName(), stopWatch.getTotalTimeSeconds());}});// 使用lambda表达式CostPrintUtil.startWatch("自定义打印耗时(lambda表达式)");Thread.sleep(200);CostPrintUtil.stopWatch();CostPrintUtil.endPrint((stopWatch) -> {String lastTaskName = stopWatch.getLastTaskName();long lastTaskTimeMillis = stopWatch.getLastTaskTimeMillis();log.info("Task: {} Costs: {}ms", lastTaskName, lastTaskTimeMillis);});}}
其中main函数提供了一些使用示例,有疑问或有改善意见的欢迎留言 ( ^_^ )。
Java耗时打印工具类相关推荐
- 【常用工具类】Java控制台打印工具类LogUtil
文章目录 1 带分割线版 2 不带分割线版 3 终极版 1 带分割线版 import java.text.SimpleDateFormat; import java.util.Date;/*** W ...
- java a3 套打印_Java输出打印工具类封装的实例
在进行Java打印输出,进行查看字段值的时候,觉得每次写了System.out.println之后,正式发布的时候,还得一个个的删掉,太麻烦了,经过别人的指教,做了一个Java的打印输出封装类,只为记 ...
- 【零基础学Java】—System类(三十五)
[零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...
- java练习-String类、StringBuilder类、StringBuffer类10
目录 String类 1 String类的概述 2 String的特点 3 String面试题看程序写结果 4 String面试题看程序写结果2 5 String类的判断功能 6 模拟用户登录练习 7 ...
- CostMonitorUtils耗时监控工具类(线程安全)
转载请注明出处::https://blog.csdn.net/jevonsCSDN/article/details/83118799 [Jevons'Blog] 本文是关于实时监控方法耗时的工具,不依 ...
- JAVA基础03-Object类,常用类,基本的数据结构, Collection常用体系,泛型-泛型通配符
1.object类 1.概述 java.lang.object类是java语言中的根类,即所有类的超类(基类)他描述的所有的方法子类都可以使用,在对象实例化的时候最终找到的类就是object 如果一个 ...
- Logger-功能强大使用方便的Log日志打印工具类
介绍 Android开发中Log日志打印对开发者来说是非常重要的功能.但是感觉Log写多了也是烦,每次都需要设置一个TAG过滤值和具体的打印信息,而且打印的信息也不够丰富. 这里我推荐一个功能强大的L ...
- Android 日志打印工具类 可显示打印所在的方法和行号
Android 日志打印工具类 可显示打印所在的方法和行号.便于开发人员查看Log信息~~ package com.newland.util;import java.io.BufferedWriter ...
- java 火焰_利用火焰图查找java耗时最长的方法
原标题:利用火焰图查找java耗时最长的方法 众所周知java方法有两种,一种是纯粹的java方法,另外一种是jni,java调用c的,方法声明是java的,实现并不是. 现在通过jni实现一些效率的 ...
- 二维码生成、打印工具类
二维码生成.打印工具类 import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; impor ...
最新文章
- 杨学海:跨境电商新通道-进口保税直邮模式解析
- Fortinet宣布收购AccelOps
- HttpClient 中文官方教程----第一章基础知识-只收录,未测试
- Redis分布式锁实现
- rank--求矩阵的秩
- eclipse中通过search打开第二个文件时 第一个文件就自己关闭了
- 干货:RabbitMQ消息队列基本原理介绍
- android 播放声音 停止其他,Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放...
- PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
- Top20的OpenSSH服务器最佳安全实践--SSHD_CONFIG配置文件详细解读
- 计算机应用科学计算文献,计算机应用参考文献
- Linux时间与NTP
- zigzag矩阵按照之字形线路产生方法(C++)
- 考研英语近义词与反义词·四
- 《孙子兵法与经理人统帅之道》读后感
- js 检测浏览器开发者控制台是否被打开
- 韵达快递投诉一直显示服务器繁忙,快递查询自动识别查询方法(6)
- 微信卡劵、微信卡包,必须是认证订阅号或认证服务号
- c语言扇形打印图片,圆形CD绘制 (扇形)
- LuatOS | 全新在线模拟器,随时随地发挥创意