java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承
2024-08-27 15:12:17
ThreadLocal类的使用
变量值的共享可以使用public static变量的形式,所有的线程都是用同一个public static变量。如果想实现每一个线程都有自己的值。该变量可通过ThreadLocal实现
定义:ThreadLocal<T> name = new ThreadLocal<>();
用法:
- 用法1、变量在线程外定义,在线程执行体内.set()赋值。
- 用法2、变量在定义时设置自动赋值的方法。在对应线程中运行时则自动赋值。
ThreadLocal<T> name = new ThreadLocal<>(){
@Override
protected String initialValue() {
return <T> t;
}
};
取值:.get()
用法1示例:
import javax.management.relation.RelationNotFoundException; /**
* @ClassName ThreadLocalExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalExample {
private static ThreadLocal<String> name = new ThreadLocal<>(); public static void main(String[] args) {
Runnable r = () -> {
String threadname = Thread.currentThread().getName();
/**
* 线程运行时赋值
*/
name.set(threadname);
System.out.println(name.get()); //不同的子线程对应子线程名,本例A\B\C
};
Thread thread = new Thread(r,"A");
Thread thread2 = new Thread(r,"B");
Thread thread1 = new Thread(r,"C");
thread.start();
thread1.start();
thread2.start();
System.out.println(name.get()); //主线程中没有赋值默认为null
}
}
用法二示例:
/**
* @ClassName ThreadLocalInitialValue
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalInitialValue {
/**
* 定义ThreadLocal变量线程中运行自动初始化值
*/
private static ThreadLocal<String> name = new ThreadLocal<>(){
@Override
protected String initialValue() {
return Thread.currentThread().getName();
}
};
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("我是" + name.get());
}
};
Thread zhangsan = new Thread(r,"张三");
Thread lisi = new Thread(r,"李四");
zhangsan.start();
lisi.start();
System.out.println("main线程中,我是" + name.get());
}
}
InheritableThreadLocal子线程中自定义值,孙线程可继承
import java.io.Reader;
import java.sql.SQLOutput; /**
* @ClassName ThreadLocalSubThread
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalSubThread {
/**
* 定义变量时,设置自动赋值方法
*/
private static ThreadLocal<String> name = new InheritableThreadLocal<>(){
@Override
protected String initialValue() {
return Thread.currentThread().getName();
}
}; public static void main(String[] args) {
Runnable r = () -> {
System.out.println("我是子线程:"+ name.get());//我是子线程:child
Thread t = new Thread(){
@Override
public void run() {
System.out.println("我是孙线程,获取子线程变量值:"+ name.get());//也是child
}
};
t.start();
};
Thread thread = new Thread(r,"child");
thread.start();
name.set("主线程"); //主线程中手动赋值
System.out.println("main线程中 name:" + name.get()); //"主线程"
}
}
最新文章
- Centos6.5 配置Nginx开机自启动
- VS低版本打开高版本解决方案(如08打开10、12、13版本vs编译的项目)
- JavaScript模板引擎artTemplate.js——template()方法
- PHP入门二【PHP include 和 require的区别】
- Redhat 7使用CentOS 7的Yum网络源
- android 动画NineOldAndroid
- Reward HDU
- 经常会用到的js函数
- OP(Over-provisioning)预留空间
- Object 类
- C# 错误:空对象不能转换为值类型
- 如何更改Audition的界面颜色
- 编写html与js交互网页心得:编写两个按钮切换显示不同的图片
- linux环境下matlab连接mysql
- Oracle EBS 查询用户职责
- Hadoop HBase概念学习系列之HBase的Shell(步骤非常清晰)(二十四)
- Sql server 存储过程基础语法
- JavaScript高级 面向对象(5)--最简单的继承方式,混入mix
- StringUtils 正则校验
- day1 python简介和入门