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");

    }
    
    
}

 

posted on 2022-10-08 18:08  oktokeep  阅读(103)  评论(0编辑  收藏  举报