使用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耗时打印工具类相关推荐

  1. 【常用工具类】Java控制台打印工具类LogUtil

    文章目录 1 带分割线版 2 不带分割线版 3 终极版 1 带分割线版 import java.text.SimpleDateFormat; import java.util.Date;/*** W ...

  2. java a3 套打印_Java输出打印工具类封装的实例

    在进行Java打印输出,进行查看字段值的时候,觉得每次写了System.out.println之后,正式发布的时候,还得一个个的删掉,太麻烦了,经过别人的指教,做了一个Java的打印输出封装类,只为记 ...

  3. 【零基础学Java】—System类(三十五)

    [零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...

  4. java练习-String类、StringBuilder类、StringBuffer类10

    目录 String类 1 String类的概述 2 String的特点 3 String面试题看程序写结果 4 String面试题看程序写结果2 5 String类的判断功能 6 模拟用户登录练习 7 ...

  5. CostMonitorUtils耗时监控工具类(线程安全)

    转载请注明出处::https://blog.csdn.net/jevonsCSDN/article/details/83118799 [Jevons'Blog] 本文是关于实时监控方法耗时的工具,不依 ...

  6. JAVA基础03-Object类,常用类,基本的数据结构, Collection常用体系,泛型-泛型通配符

    1.object类 1.概述 java.lang.object类是java语言中的根类,即所有类的超类(基类)他描述的所有的方法子类都可以使用,在对象实例化的时候最终找到的类就是object 如果一个 ...

  7. Logger-功能强大使用方便的Log日志打印工具类

    介绍 Android开发中Log日志打印对开发者来说是非常重要的功能.但是感觉Log写多了也是烦,每次都需要设置一个TAG过滤值和具体的打印信息,而且打印的信息也不够丰富. 这里我推荐一个功能强大的L ...

  8. Android 日志打印工具类 可显示打印所在的方法和行号

    Android 日志打印工具类 可显示打印所在的方法和行号.便于开发人员查看Log信息~~ package com.newland.util;import java.io.BufferedWriter ...

  9. java 火焰_利用火焰图查找java耗时最长的方法

    原标题:利用火焰图查找java耗时最长的方法 众所周知java方法有两种,一种是纯粹的java方法,另外一种是jni,java调用c的,方法声明是java的,实现并不是. 现在通过jni实现一些效率的 ...

  10. 二维码生成、打印工具类

    二维码生成.打印工具类 import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; impor ...

最新文章

  1. 杨学海:跨境电商新通道-进口保税直邮模式解析
  2. Fortinet宣布收购AccelOps
  3. HttpClient 中文官方教程----第一章基础知识-只收录,未测试
  4. Redis分布式锁实现
  5. rank--求矩阵的秩
  6. eclipse中通过search打开第二个文件时 第一个文件就自己关闭了
  7. 干货:RabbitMQ消息队列基本原理介绍
  8. android 播放声音 停止其他,Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放...
  9. PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
  10. Top20的OpenSSH服务器最佳安全实践--SSHD_CONFIG配置文件详细解读
  11. 计算机应用科学计算文献,计算机应用参考文献
  12. Linux时间与NTP
  13. zigzag矩阵按照之字形线路产生方法(C++)
  14. 考研英语近义词与反义词·四
  15. 《孙子兵法与经理人统帅之道》读后感
  16. js 检测浏览器开发者控制台是否被打开
  17. 韵达快递投诉一直显示服务器繁忙,快递查询自动识别查询方法(6)
  18. 微信卡劵、微信卡包,必须是认证订阅号或认证服务号
  19. c语言扇形打印图片,圆形CD绘制 (扇形)
  20. LuatOS | 全新在线模拟器,随时随地发挥创意

热门文章

  1. 天嵌通途B210和USRP B210性能对比实验
  2. 软件测试的概念与过程
  3. IDEA常用插件、设置、注释
  4. 巴士教你识别和选购iPhone全四代卡贴
  5. C语言 实现 面向对象编程 OOC
  6. opencv python 对指针仪表读数识别
  7. 实现开通个人支付宝与微信扫码支付
  8. 网络、域名、DNS、A记录以及MX记录的基本概念
  9. 以艺术教育培养大学生艺术素质
  10. 一文搞定BP神经网络——从原理到应用(原理篇)