首页 > 其他分享 >ThreadLocal本地局部线程demo

ThreadLocal本地局部线程demo

时间:2022-10-08 18:25:01浏览次数:48  
标签:Thread -- demo ThreadLocalUtils localValue ThreadLocal 线程

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

    }
    
    
}

 

标签:Thread,--,demo,ThreadLocalUtils,localValue,ThreadLocal,线程
From: https://www.cnblogs.com/oktokeep/p/16769798.html

相关文章

  • Thread的join方法demo
    Thread的join方法demo/***关于join官方的解释是Waitsforthisthreadtodie.也就是等待一个线程结束。*/publicclassThreadJoinTest{publicstaticvo......
  • Java中如何实现两个线程交替运行呢?
    今天笔者收到老师的一个题目,让我准备两个流程,依次实现输出以下信息 如:  线程A打印字母a,线程B打印数字1线程A打印字母b,线程B打印数字2线程A打印字母......
  • Demo25_方法的调用
    //方法调用加法典例packagecom.HuanXin.Fan_Fa_5;publicclassDemo01{//main方法publicstaticvoidmain(String[]args){intA=add(3,4);//调用a......
  • Demo26_加强方法调用的理解
    //加强方法调用的理解packagecom.HuanXin.Fan_Fa_5;publicclassDemo02{publicstaticvoidmain(String[]args){CHX();//调用下文CHX()方法}//......
  • Python多线程
    一、概念线程是CPU分配资源的基本单位,当程序开始运行,这个程序就变成了一个进程;当有多线程编程时,一个进程包含多个线程(含主线程),使用线程可以实现程序大的开发任务。多线......
  • Java小白自学笔记——线程
    一、线程的相关概念1.程序:是为完成特定任务,用某种语言编写的一组指令的集合。简单地说:就是我们写的代码2.进程:(1)进程是指运行中的程序,启动了一个进程,操作系统就......
  • Java_多线程
    Java_多线程1.实现多线程1.1进程和线程【理解】进程:是正在运行的程序是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源线程:是进程......
  • packer demo
    ks 应答文件demo installtextrebootlangen_US.UTF-8keyboardustimezone--utcEtc/UTCrootpw--plaintext'kangwen12#$'zerombrautopart--type=plain-......
  • TTD 专题 (第一篇):C# 那些短命线程都在干什么?
    一:背景1.讲故事在分析的众多dump中,经常会遇到各种奇葩的问题,仅通过dump这种快照形式还是有很多问题搞不定,而通过perfview这种粒度又太粗,很难找到问题之所在,真的很头疼,比如......
  • Fairness without Demographics through Adversarially Reweighted Learning
    目录概符号说明本文方法代码LahotiP.,BeutelA.,ChenJ.,LeeK.,ProstF.,ThainN.,WangX.andCHiE.H.Fairnesswithoutdemographicsthroughadversariall......