import java.io.*;
import java.util.logging.*;
public class SimpleThreadLogger {
private static final java.lang.ThreadLocal<Logger> threadLocal = new java.lang.ThreadLocal<Logger>();
// 输出信息
public static void log(String msg) {
getThreadLogger().log(Level.INFO, msg);
}
// 根据线程获得专属Logger
private static Logger getThreadLogger() {
Logger logger = threadLocal.get();
if (logger == null) {
try {
logger = Logger.getLogger(Thread.currentThread().getName());
// Logger 默认是在主控台输出
// 我们加入一个文件输出的Handler
// 它会输出XML的记录文件
logger.addHandler(new FileHandler(Thread.currentThread().getName() + ".log"));
} catch (IOException e) {
}
threadLocal.set(logger);
}
return logger;
}
}
public class LoggerTest {
public static void main(String[] args) {
new TestThread("thread1").start();
new TestThread("thread2").start();
new TestThread("thread3").start();
}
}
class TestThread extends Thread {
public TestThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 10; i++) {
SimpleThreadLogger.log(getName() + ": message " + i);
try {
Thread.sleep(1000);
} catch (Exception e) {
SimpleThreadLogger.log(e.toString());
}
}
}
}
import java.util.*;
public class ThreadLocal<T> {
// 获得一个同步化的Map对象
private Map<Thread, T> storage = Collections
.synchronizedMap(new HashMap<Thread, T>());
public T get() {
// 获得目前执行get()方法的线程
Thread current = Thread.currentThread();
// 根据线程获得线程自有的资源
T t = storage.get(current);
// 如果还没有线程专用的资源空间
// 则建立一个新的空间
if (t == null && !storage.containsKey(current)) {
t = initialValue();
storage.put(current, t);
}
return t;
}
public void set(T t) {
storage.put(Thread.currentThread(), t);
}
public T initialValue() {
return null;
}
}
注:使用ThreadLocal,一般都是声明在静态变量中,如果不断的创建ThreadLocal而且没有调用其remove方法,将会导致内存泄露。
分享到:
相关推荐
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
深入研究java.lang.ThreadLocal类。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是 threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。
java 简单的ThreadLocal示例
主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用...
主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下
主要介绍了Java ThreadLocal 线程安全问题解决方案的相关资料,需要的朋友可以参考下
主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下
利用过滤器去获取request和response,进行将其设置到ThreadLocal从而保证我的请求的安装线,这样就能在java普通类中获取request和response
主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下
Java中ThreadLocal的设计与使用.doc
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,本文会详细的介绍一下,有兴趣的可以了解一下
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,特别适用于各个线程依赖不通的变量值完成操作的场景。下面我们来详细了解一下它吧
Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal Java资料—详解ThreadLocal
早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...