线程本地变量ThreadLocal (耗时工具)【原】
线程本地变量类
- package king;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.TreeMap;
- /**
- * TLTimeContainer为ThreadLocalTimeContainer(线程本地变量时间容器)的缩写
- * 说明:用来在任意一个方法内部置入recordTime(),以作片断时间点的记录
- * @author King
- * @time 2015/10/29
- */
- public class TLTimeContainer {
- public static ThreadLocal<Map<String,List<Long>>> tl = new ThreadLocal<Map<String,List<Long>>>();
- /**
- * 记录调用本方法的 类的方法 起,止时间
- */
- public static void recordTime() {
- String clazz = Thread.currentThread().getStackTrace()[2].getClassName();
- String method = Thread.currentThread().getStackTrace()[2].getMethodName();
- Long l = System.currentTimeMillis();
- if (tl.get() == null) {
- Map<String,List<Long>> outerMap = new TreeMap<String,List<Long>>();
- List<Long> list1 = new ArrayList<Long>();
- list1.add(System.currentTimeMillis());
- outerMap.put("类"+clazz+"->"+"方法"+method+" ", list1);
- tl.set(outerMap);
- } else {
- Map<String,List<Long>> outerMap= tl.get();
- if(outerMap != null){
- List<Long> list2 = null;
- list2 = outerMap.get("类"+clazz+"->"+"方法"+method+" ");
- if(list2 != null){
- list2.add(System.currentTimeMillis());
- }else{
- list2 = new ArrayList<Long>();
- list2.add(System.currentTimeMillis());
- outerMap.put("类"+clazz+"->"+"方法"+method+" ", list2);
- }
- }
- }
- }
- /**
- * 打印放入本容器中的 类的方法的起,止时间和耗时
- */
- public static void print(){
- Map<String,List<Long>> outerMap= tl.get();
- if (outerMap != null) {
- for (Entry<String, List<Long>> entry : outerMap.entrySet()) {
- // System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
- List<Long> list = entry.getValue();
- Long start = list.get(0);
- if(list.size() == 2){
- Long end = list.get(1);
- System.out.println(entry.getKey()+"起于:"+start);
- System.out.println(entry.getKey()+"止于:"+end);
- System.out.println(entry.getKey()+"耗时:"+(end-start));
- }else{
- System.out.println(entry.getKey()+"起于:"+start);
- }
- System.out.println("__________________________________________");
- }
- }
- clearAll();
- }
- /**
- * 清除所有
- */
- public static void clearAll(){
- tl.remove();
- }
- /**
- * 清除单个对象
- */
- public static void remove(Map map) {
- if (tl.get() != null) {
- tl.get().remove(map);
- }
- }
- }
入口类
- package king;
- public class Entrance {
- public static void main(String[] args) throws Exception{
- method1();
- method2();
- TLTimeContainer.print();
- TLTimeContainer.clearAll();
- }
- public static void method1() throws Exception {
- TLTimeContainer.recordTime();// 方法入口调用
- Thread.sleep(1000);
- TLTimeContainer.recordTime();// 方法出口调用
- }
- public static void method2() throws Exception {
- TLTimeContainer.recordTime();// 方法入口调用
- Thread.sleep(2000);
- TLTimeContainer.recordTime();// 方法出口调用
- }
- }
运行后打印结果:
- 类compare.Other->方法m1 起于:1446088276528
- 类compare.Other->方法m1 止于:1446088277528
- 类compare.Other->方法m1 耗时:1000
- __________________________________________
- 类compare.Other->方法m2 起于:1446088277528
- 类compare.Other->方法m2 止于:1446088279529
- 类compare.Other->方法m2 耗时:2001
- __________________________________________
源码下载: http://pan.baidu.com/s/1jGlOdvw
打我击当前方法的类名和方法名
- public void printClassMethod(){
- StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
- String clazz = stackTraceElements[2].getClassName();
- String method = stackTraceElements[2].getMethodName();
- System.err.println("类"+clazz+"->"+"方法"+method+ "_____________" + assetCheckCode);
- }
然后在其它方法中 调用本方法即可 , 至于数组下标 [x] 中的x是多少,要看当前方法被调用的层级,断点看一下, 再决定下标[]好了
线程本地变量ThreadLocal (耗时工具)【原】的更多相关文章
- 线程本地变量ThreadLocal (耗时工具)
线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- 线程本地变量ThreadLocal
一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...
- Java并发(二十):线程本地变量ThreadLocal
ThreadLocal是一个本地线程副本变量工具类. 主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的 ...
- 深入理解线程本地变量ThreadLocal
ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...
- JAVA线程本地变量ThreadLocal和私有变量的区别
ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 所以,在Java中编写线程局部变量的代码相对来说要笨 ...
- Java并发机制(4)--ThreadLocal线程本地变量(转)
个人理解: 说明:看了博客园中大神写的ThreadLocal的详解,感觉还是有些迷糊,下面用自己的理解简单描述下ThreadLocal的机制(难免有误): 1.首先ThreadLocal用于存储对应线 ...
- ThreadLocal 线程本地变量 及 源码分析
■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...
- Threadlocal线程本地变量理解
转载:https://www.cnblogs.com/chengxiao/p/6152824.html 总结: 作用:ThreadLocal 线程本地变量,可用于分布式项目的日志追踪 用法:在切面中生 ...
随机推荐
- JSP中properties文件的路径问题
做练习的时候,写了个properties文件,放在src/servlet/目录下,访问文件问题花了点时间折腾,最终得到解决,记下. 环境:eclipse jee oxygen,tomcat 9.0. ...
- Jfrog Maven jenkins pipeline 流水线 培训 简单实验
1. 公司购买了一套jfrog artifactory ,然后厂商组织了一次培训 本次简单记录一下 jenkins和jfrog 二进制仓库的简单连接使用 2. 前期环境准备. scp jdk的tar包 ...
- WebService相关
1.WebService 之 WSDL文件 讲解 2.WSDL样式详解 3.IntelliJ IDEA 开发 WebService 4.浅谈WebService的调用 5.用IDEA8快速开发WebS ...
- 归并排序详解(python实现)
因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现. 还是先阐述一下排序思路: 首先归并排序使用了二分法,归根到底的思想还是 ...
- (String)强制转换、toString()和String.valueOf()的区别
String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在java的世界里没有什么东西是没有缺点的,总有一些好的方面同时也 ...
- jquery添加刪除
創建元素的方法:jquery.javascript/dom,html/text var txt1="<p>Text.</p>"; ...
- Highcharts之3D柱状图
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 任意目录下启动tomcat
DOS中启动tomcat 1.将tomcat的bin目录添加到Path变量中 2.添加catalina_home变量 3.命令行输入catalina run ojbk
- MT【58】反演圆和极线极点和谐统一
解答:如图 评:1.反演圆及其性质介绍: 评2:此题的源头是1995年全国卷压轴题,这里用极线极点的相关性质也可以处理: 注:用相关点法很容易得到轨迹.
- 丢手帕问题 (约瑟夫问题)Java实现
问题: 丢手帕游戏是约瑟夫问题的一个变种,游戏很简单,N个小孩围成一个圈,标号为1到N,从编号为m的小孩开始报数,报到第L个小孩退出游戏,然后下一个小孩继续从1开始报数,数到第L个小孩退出游戏,如此循 ...