ThreadLocal本地局部线程demo
ThreadLocal本地局部线程demo
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"); } }