线程局部变量共享 -- 使用ThreadLocal解决该需求

1.创建容器类

java 复制代码
//容器类
public class Contain {

	private static final ThreadLocal<DataPackage> local;
	
	 static {
		 local = new ThreadLocal<>();
	 }

	public static ThreadLocal<DataPackage> getLocal() {
		return local;
	}
}

2.创建数据包类

java 复制代码
//数据包类
public class DataPackage {
	
	private String str;
	private int num;
	
	public static DataPackage getInstance(String str, int num) {
		//获取当前线程共享的DataPackage对象
		ThreadLocal<DataPackage> local = Contain.getLocal();
		DataPackage dataPackage = local.get();
		
		if(dataPackage == null) {
			dataPackage = new DataPackage(str, num);
			local.set(dataPackage);
		}else {
			dataPackage.setStr(str);
			dataPackage.setNum(num);
		}
		return dataPackage;
	}
	
	private DataPackage(String str, int num) {
		super();
		this.str = str;
		this.num = num;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return "DataPackage [str=" + str + ", num=" + num + "]";
	}
	
}

3.创建A类B类

java 复制代码
public class A {
	 
	public void println() {
		
		//获取容器
		ThreadLocal<DataPackage> local = Contain.getLocal();
		
		//通过当前线程获取对应的共享数据
		Thread t = Thread.currentThread();
		DataPackage data = local.get();
		System.out.println(t.getName() + "里的A类对象获取了数据:" + data);
		
	}

}

public class B {
	
	public void println() {
		
		ThreadLocal<DataPackage> local = Contain.getLocal();
		
		Thread t = Thread.currentThread();
		DataPackage data = local.get();
		System.out.println(t.getName() + "里的B类对象获取了数据:" + data);
		
	}

}

4.创建测试类

java 复制代码
public class Test01 {

	//知识点:线程局部变量共享的问题 -- 使用ThreadLocal解决该需求
	public static void main(String[] args) {

		//线程1
		new Thread(new Runnable() {

			@Override
			public void run() {
				//共享的数据
				DataPackage dataPackage = DataPackage.getInstance("我好像在哪见过你", 10);

				//获取容器,并存储数据
				ThreadLocal<DataPackage> local = Contain.getLocal();
				local.set(dataPackage);

				//创建对象
				A a = new A();
				B b = new B();

				//获取共享数据
				a.println();
				b.println();

			}
		},"线程1").start();

		//线程2
		new Thread(new Runnable() {

			@Override
			public void run() {
				//共享的数据
				DataPackage dataPackage = DataPackage.getInstance("明明就", 20);
						
				//获取容器,并存储数据
				ThreadLocal<DataPackage> local = Contain.getLocal();
				local.set(dataPackage);

				//创建对象
				A a = new A();
				B b = new B();

				//获取共享数据
				a.println();
				b.println();
				
			}
		},"线程2").start();

	}

}
相关推荐
奶香臭豆腐8 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
晚夜微雨问海棠呀16 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun16 分钟前
C语言初阶习题【9】数9的个数
c语言·开发语言
hanbarger18 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye26 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋338 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行39 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园42 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区1 小时前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift