ThredLocal的使用

ThredLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值得存储结构。

package cn.com.test;

import java.util.concurrent.TimeUnit;

public class Profiler {

	//第一次get()方法调用时会进行初始化(如果set方法没有调用),每个线程会调用一次
	private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
		protected  Long initialValue(){
			return System.currentTimeMillis();
		}
		};
		
		public static final void begin() {
			TIME_THREADLOCAL.set(System.currentTimeMillis());
	}
		
		public static final long end(){
			return System.currentTimeMillis() - TIME_THREADLOCAL.get();
		}
		
		public static void main(String[] args) throws Exception {
			Profiler.begin();
			TimeUnit.SECONDS.sleep(10);
			System.out.println("cost:" + Profiler.end() + " mills");
		}
}

以上Profiler可以被复用在方法调用耗时统计的功能上,在方法的入口前执行begin()方法,在方法调用后执行end()方法,好处是两个方法的调用不用再一个方法或者类中,比如在AOP(面向切面变成)中,可以在方法调用前的切入点执行begin()方法,而在方法调用后的切入点执行end()方法,这样依旧可以获得方法的执行耗时。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏潇涧技术专栏

Python Basics

1.使用glob模块可以用通配符的方式搜索某个目录下的特定文件,返回结果是一个list

832
来自专栏章鱼的慢慢技术路

Go指南练习_映射

1344
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻block的本质(一)

2614
来自专栏Python小屋

Python花式编程案例集锦(5)

问题描述: 输入三个序列,例如:[0.9,0.5,0.7],[0.4,0.6,0.3],[0.5,0.2,0.4],输出三个序列中各取一个相乘后最大的值,以及组...

2745
来自专栏数据结构与算法

HDU 3530Subsequence(单调队列)

给出$n$个数,找出最长的区间,使得区间中最大数$-$最小数 $>= m$ 且$<= k$

581
来自专栏小樱的经验随笔

C++STL vector详解(杂谈)

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_i...

3649
来自专栏进击的程序猿

C++奇淫巧技之SFINAE

SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选...

743
来自专栏lulianqi

理解委托类型

delegate 是一种可用于封装命名或匿名方法的引用类型。(并不是所有的引用类型都是class)

820
来自专栏栗霖积跬步之旅

2.2synchronized同步语句块

使用synchronized虽然能够避免不同步的现象出现,但是也会出现弊端,比如代码执行时间过长,那么其他线程就必须等待该线程执行完毕释放锁之后才能拿到锁。 面...

23810
来自专栏JavaEdge

深入理解JDK动态代理机制

3186

扫码关注云+社区