Java:ThreadLocal是什么?
ThreadLocal指的是每个线程使用的区域独立,互不干扰。
它的子类InheritableThreadLocal可以把数据传递给子线程。
一般创建为对象的静态属性。
常用方法:
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()); } } }
运行结果: