概论
ThreadLocal指的是开辟一块统一初始化的空间,在这个区域块里每个线程使用的区域独立,互不干扰。一般创建为对象的静态属性。
常用方法:
set (value)
get(value)
子类的initialValue()设置初始值。
示例:
public class LeaningThread { //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值 private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){ @Override protected Integer initialValue() { //初始化的值为2 return 2; } }; public static void main(String[] args) throws InterruptedException { //获取main线程的ThreadLocal区域存放的值 System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); //修改 threadLocal.set(20); //获取main线程的ThreadLocal区域存放的值 System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); Test t = new Test(); t.start(); } //内部类 static class Test extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); threadLocal.set(threadLocal.get()-3); System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); } } }
运行结果:
注意事项
关注 ThreadLocal 的归属问题,1、在构造器中调用,哪个线程调用的,就属于谁。2、run方法中,就是自己的。
示例代码:
public class LeaningThread { //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值 private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){ @Override protected Integer initialValue() { //初始化的值为2 return 2; } }; public static void main(String[] args) throws InterruptedException { //修改main线程的值 threadLocal.set(20); new Thread(new Test()).start(); } //内部类 static class Test implements Runnable{ public Test(){ //main线程调用的构造器 System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); } @Override public void run() { threadLocal.set(threadLocal.get()-3); System.out.println(Thread.currentThread().getName()+":"+threadLocal.get()); } } }
运行结果:
子类InheritableThreadLocal
一个存储区域可以往下带的子类,main线程开的Thread1,那么Thread1也使用这个区域。
示例代码:
public class LeaningThread { //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值 //一个值可以往下带的子类,main开的Thread1,那么Thread1也使用这个区域 private static ThreadLocal<Integer> threadLocal2 = new InheritableThreadLocal<>(); public static void main(String[] args) throws InterruptedException { //修改main线程的值 threadLocal2.set(20); new Thread(new Test()).start(); } //内部类 static class Test implements Runnable{ public Test(){ //main线程调用的构造器 System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get()); } @Override public void run() { threadLocal2.set(threadLocal2.get()-3); System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get()); } } }
运行结果:
标签:main,Java,Thread,get,threadLocal,ThreadLocal,线程,多线程 From: https://www.cnblogs.com/lurenjia-bky/p/16887825.html