• 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");
    
        }
        
        
    }
  • 相关阅读:
    netbeans中给jpanl添加背景图片制定代码的理解——匿名内部类继承父类
    关于 ASP.NET MVC 中的视图生成
    Python的descriptor (2)
    分享php中四种webservice实现的简单架构方法及实例
    Python 中的 is 和 id
    Python的OO思想
    Python异常记录
    Python单例模式研究
    Python基础笔记
    python 映射列表 学习
  • 原文地址:https://www.cnblogs.com/oktokeep/p/16769798.html
Copyright © 2020-2023  润新知