admin管理员组文章数量:1487745
ThreadLocal本地局部线程demo
ThreadLocal本地局部线程demo
代码语言:javascript代码运行次数:0运行复制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");
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-10-08,如有侵权请联系 cloudcommunity@tencent 删除数据库string变量连接线程本文标签: ThreadLocal本地局部线程demo
版权声明:本文标题:ThreadLocal本地局部线程demo 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1754982850a3182064.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论