ThreadLocal本地局部线程demo
代码语言:javascript复制import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* 本工具只能保存一个线程内的变量
* 变量是同一个,但是每个线程都使用同一个初始值,也就是使用同一个变量的一个新的副本。这种情况之下ThreadLocal就非常使用,
* 比如说DAO的数据库连接,我们知道DAO是单例的,那么他的属性Connection就不是一个线程安全的变量。而我们每个线程都需要使用他,并且各自使用各自的。这种情况,ThreadLocal就比较好的解决了这个问题。
*
*/
public class ThreadLocalUtils {
private final static Logger LOG = LoggerFactory.getLogger(ThreadLocalUtils.class);
private ThreadLocal<Map<String,String>> localValue = new ThreadLocal<Map<String, String>>();
private static ThreadLocalUtils singleton =new ThreadLocalUtils();
private ThreadLocalUtils(){
Object obj = localValue.get();
}
private void addValue(String key,String value){
Map<String,String> maps = localValue.get();
if(maps==null){
localValue.set(new HashMap<String,String>());
}
localValue.get().put(key,value);
}
/**
* 向日志辅助工具中放入需要输出的变量
*/
public static void addLog(String key,String value){
if(value!=null&&value.trim().length()>0) {
singleton.addValue(key, value);
}
}
public static void removeLog() {
singleton.removeValue();
}
public void removeValue() {
Map<String,String> maps = localValue.get();
if(null != maps) {
localValue.remove();
}
}
public static Map<String,String> getAllLocalVariables(){
return singleton.localValue.get();
}
/**
* 打印输出
*
* main,打印参数2:{test3=test333, test=test111} -->outer
* Thread-0,打印参数:{test2=test222} -->inner
* main,打印参数3:null -->outer
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ThreadLocalUtils.addLog("test","test111");
Thread t= new Thread(new Runnable() {
@Override
public void run() {
ThreadLocalUtils.addLog("test2","test222");
System.out.println(Thread.currentThread().getName() ",打印参数:" ThreadLocalUtils.getAllLocalVariables() " -->inner");
}
});
ThreadLocalUtils.addLog("test3","test333");
t.start();
// t.join();
/** 打开上面的这一行代码后的输出:
* Thread-0,打印参数:{test2=test222} -->inner
* main,打印参数2:{test3=test333, test=test111} -->outer
* main,打印参数3:null -->outer
*/
System.out.println(Thread.currentThread().getName() ",打印参数2:" ThreadLocalUtils.getAllLocalVariables() " -->outer");
t.join();
ThreadLocalUtils.removeLog();
System.out.println(Thread.currentThread().getName() ",打印参数3:" ThreadLocalUtils.getAllLocalVariables() " -->outer");
}
}