ThreadLocal学习Demo
时间:2019-03-19
本文章向大家介绍ThreadLocal学习Demo,主要包括ThreadLocal学习Demo使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用ThreadLocal就实现了多线程里的单线程。。ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>(); MyThreadEntity2 entity = threadLocal.get(); entity 中存放的是单个线程整个生命周期都可以共享的数据。实现了多个线程时单个线程的数据隔离,每个线程都会有自己的ThreadLocal<T> 对象,存放自己的数据。
package com.thc.utils; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 田海超 * @E-mail tianhaichao@sinosoft.com.cn * @date 2019年3月19日 上午10:32:37 * @Description 单个线程整个声明周期的共享参数 */ public class ThreadLocalUtils2 { // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数) private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>(); /** * @author 田海超 * @date 2019年3月19日 * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建) */ public static MyThreadEntity2 getMyThreadEntity() { MyThreadEntity2 entity = threadLocal.get(); if (entity == null) { entity = new MyThreadEntity2(); threadLocal.set(entity); } return entity; } /** * @author 田海超 * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】 */ public static void remove() { threadLocal.remove(); } /** * <li>创建人:xiepan</li> * <li>创建时间:2018年5月3日</li> * <li>创建目的:【获取当前MyThreadEntity中的Map】</li> */ public static Map<String, String> getThreadMap() { Map<String, String> map = getMyThreadEntity().getMap(); if (map == null) { map = new HashMap<>(); getMyThreadEntity().setMap(map); } return map; } /** * @author 田海超 * @date 2019年3月19日 * @param key * @param value * description :创建目的:【当前线程内添加key值】 */ public static void put(String key, String value) { getThreadMap().put(key, value); } /** * @author 田海超 * @date 2019年3月19日 * @param key * @return description :创建目的:【当前线程内获取value值】 */ public static String get(String key) { return getThreadMap().get(key); } public static void main(String[] args) { // 使用时,先往线程实例中放值 ThreadLocalUtils2.getMyThreadEntity().setPlanId("1033"); ThreadLocalUtils2.getThreadMap().put("aa", "test"); // 然后在需要用的时候取值 ThreadLocalUtils2.getMyThreadEntity().getPlanId(); ThreadLocalUtils2.getThreadMap().get("aa"); } } class MyThreadEntity{ private Map<String, String> map; private List<?> list; private Date date = new Date(); private String planId; public String getPlanId() { return planId; } public void setPlanId(String planId) { this.planId = planId; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public List<?> getList() { return list; } public void setList(List<?> list) { this.list = list; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
package com.sinosig.xb.crms.utils; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 田海超 * @E-mail tianhaichao@sinosoft.com.cn * @date 2019年3月19日 上午10:32:37 * @Description 单个线程整个声明周期的共享参数 */ public class ThreadLocalUtils3 { // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数) private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>(); /** * @author 田海超 * @date 2019年3月19日 * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建) */ public static MyThreadEntity2 getMyThreadEntity() { MyThreadEntity2 entity = threadLocal.get(); if (entity == null) { entity = new MyThreadEntity2() { private Map<String, String> map; private List<?> list; private Date date = new Date(); private String planId; public String getPlanId() { return planId; } public void setPlanId(String planId) { this.planId = planId; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public List<?> getList() { return list; } public void setList(List<?> list) { this.list = list; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }; threadLocal.set(entity); } return entity; } /** * @author 田海超 * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】 */ public static void remove() { threadLocal.remove(); } /** * <li>创建人:xiepan</li> * <li>创建时间:2018年5月3日</li> * <li>创建目的:【获取当前线程ConcurrentHashMap】</li> */ public static Map<String, String> getThreadMap() { Map<String, String> map = getMyThreadEntity().getMap(); if (map == null) { map = new HashMap<>(); getMyThreadEntity().setMap(map); } return map; } /** * @author 田海超 * @date 2019年3月19日 * @param key * @param value * description :创建目的:【当前线程内添加key值】 */ public static void put(String key, String value) { getThreadMap().put(key, value); } /** * @author 田海超 * @date 2019年3月19日 * @param key * @return description :创建目的:【当前线程内获取value值】 */ public static String get(String key) { return getThreadMap().get(key); } public static void main(String[] args) { // 使用时,先往线程实例中放值 ThreadLocalUtils3.getMyThreadEntity().setPlanId("1033"); ThreadLocalUtils3.getThreadMap().put("aa", "test"); // 然后在需要用的时候取值 ThreadLocalUtils3.getMyThreadEntity().getPlanId(); ThreadLocalUtils3.getThreadMap().get("aa"); } }
方法里使用内部类:
ThreadLocalUtils3中getThreadMap方法的注解是错的。真正的ConcurrentHashMap是这样的:
参考博文:https://www.cnblogs.com/ITtangtang/p/3948786.html
参考博文:https://blog.csdn.net/qq_38663729/article/details/80058980
- 通过多说服务器缓存加速Gravatar 头像,解决被墙问题
- asp.net mvc脚手架代码生成工具
- Page.FindControl方法找不到指定控件的原因
- Silverlight 2 DispatcherTimer和通过XAML创建UI元素
- 腾讯移动安全实验室发布《2013年手机安全报告》
- 自定义Unity 容器的扩展 --- Unity Application Block Event Broker
- LINQ to SQL集成到应用程序中需考虑的一些问题
- WCF的追踪分析工具——SvcPerf
- 解决七牛云存储缓存加速Gravatar 头像图片路径url 参数失效的问题
- 命令行解析的规则以及Command Line Parser Library
- 简单代码让WordPress 支持电子邮箱(Email)作为登录名
- .NET Migration工具
- 如何有效监控.NET 应用程序
- 写入Ring Buffer
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle 表分区笔记
- Java并发编程
- 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
- ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)
- R-plotly|甘特图(Gantt chart)- 一不小心年中了,立个flag
- XXE漏洞那些事儿(JAVA)
- Hexo 建站过程
- Tidyverse|tidyr数据重塑之gather,spread(长数据宽数据转化)
- fastjson中的jndi注入
- R|生存分析-结果整理
- 实验吧-因缺思汀的绕过
- MySQL 用户与授权管理详解
- 基本知识|R语言简单饼图的绘制
- 分享一个有趣且牛逼的漏洞
- ggplot2-annotation|画图点“精”,让图自己“解释”