class ThreadLocal<T>
其中get()方法:取得当前线程范围内共享变量的值。
set()方法:把当前共享变量的值存到ThreadLocal(T)里面。
即get()是得到ThreadLocal里面的共享变量值,set()是存储ThreadLocal里面共享变量的值。
例题:线程0和线程1同时用class A和class B取得name和age两个值。
package cn.itcast.heima2;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadLocalTest {
private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();
public static void main(String[] args) {
for(int i=0;i<2;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
x.set(data);
/* MyThreadScopeData myData = new MyThreadScopeData();
myData.setName("name" + data);
myData.setAge(data);
myThreadScopeData.set(myData);*/
MyThreadScopeData.getThreadInstance().setName("name" + data);
MyThreadScopeData.getThreadInstance().setAge(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
int data = x.get();
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
/* MyThreadScopeData myData = myThreadScopeData.get();;
System.out.println("A from " + Thread.currentThread().getName()
+ " getMyData: " + myData.getName() + "," +
myData.getAge());*/
MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
System.out.println("A from " + Thread.currentThread().getName()
+ " getMyData: " + myData.getName() + "," +
myData.getAge());
}
}
static class B{
public void get(){
int data = x.get();
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
System.out.println("B from " + Thread.currentThread().getName()
+ " getMyData: " + myData.getName() + "," +
myData.getAge());
}
}
}
class MyThreadScopeData{
private MyThreadScopeData(){} //私有化构造方法,通过getThreadInstance访问类
public static /*synchronized*/ MyThreadScopeData getThreadInstance(){
MyThreadScopeData instance = map.get();
if(instance == null){
instance = new MyThreadScopeData();
map.set(instance);
}
return instance;
}
//private static MyThreadScopeData instance = null;//new MyThreadScopeData();
private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
Thread-0 has put data :-960708810
A from Thread-0 get data :-960708810
A from Thread-0 getMyData: name-960708810,-960708810
Thread-1 has put data :1093825706
B from Thread-0 get data :-960708810
B from Thread-0 getMyData: name-960708810,-960708810
A from Thread-1 get data :1093825706
A from Thread-1 getMyData: name1093825706,1093825706
B from Thread-1 get data :1093825706
B from Thread-1 getMyData: name1093825706,1093825706
ps:其中把Age和Name封装在MyThreadScopeData类里面,并且私有化构造方法,外面无法实例化类对象,通过单例模式在getTreadInstance方法里面定义MyThreadScopeData对面并且通过ThreadLocal<MyThreadScopeData> get得到map的值,从而实现数据的传递。
在外部main函数里面调用MyThreadScopeData的时候是通过MyThreadScopeData.getTreadInstance.set(data)设置存储MyThreadScopeData的值的。
简单说就是MyThreadScopeData定义静态方法,main函数设置存储共享变量,外部类class A和class B取得存储的共享变量,实现相同变量,不同线程使用,值不相同的效果。
这次主要运用到了java高类聚性的思想,把多个变量封装在一个类里面(避免了定义多个ThreadLocal是代码赘余),外部类调用。