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()); //"主线程"
}
}

最新文章

  1. Centos6.5 配置Nginx开机自启动
  2. VS低版本打开高版本解决方案(如08打开10、12、13版本vs编译的项目)
  3. JavaScript模板引擎artTemplate.js——template()方法
  4. PHP入门二【PHP include 和 require的区别】
  5. Redhat 7使用CentOS 7的Yum网络源
  6. android 动画NineOldAndroid
  7. Reward HDU
  8. 经常会用到的js函数
  9. OP(Over-provisioning)预留空间
  10. Object 类
  11. C# 错误:空对象不能转换为值类型
  12. 如何更改Audition的界面颜色
  13. 编写html与js交互网页心得:编写两个按钮切换显示不同的图片
  14. linux环境下matlab连接mysql
  15. Oracle EBS 查询用户职责
  16. Hadoop HBase概念学习系列之HBase的Shell(步骤非常清晰)(二十四)
  17. Sql server 存储过程基础语法
  18. JavaScript高级 面向对象(5)--最简单的继承方式,混入mix
  19. StringUtils 正则校验
  20. day1 python简介和入门

热门文章

  1. CF814E An unavoidable detour for home
  2. 洛谷 P3644 [APIO2015]八邻旁之桥(对顶堆维护中位数)
  3. NOIP 2020 游记
  4. [R] 如何快速生成许多差异明显的颜色?
  5. R同时保存png/pdf等格式图片
  6. python基础实战
  7. SpringBoot 整合 MyBatis,实现 CRUD 示例
  8. nodejs-os模块
  9. Vue 之keep-alive的使用,实现页面缓存
  10. D3学习-加载本地数据