package cn.xcy.javathead;
import java.util.Random;
public class javaThreadLocal {
public static void main(String []args){
for(int i=0;i<10;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
MyThreadLocalData.getThreadInstance().setName("xiangchenyu=>"+data);
MyThreadLocalData.getThreadInstance().setAge(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
MyThreadLocalData mld=MyThreadLocalData.getThreadInstance();
System.out.println("A线程的名字==>"+mld.getName());
System.out.println("A线程的年龄==>"+mld.getAge());
}
}
static class B{
public void get(){
MyThreadLocalData mld=MyThreadLocalData.getThreadInstance();
System.out.println("B线程的名字==>"+mld.getName());
System.out.println("B线程的年龄==>"+mld.getAge());
}
}
}
class MyThreadLocalData{
private MyThreadLocalData(){}
private static ThreadLocal<MyThreadLocalData> map=new ThreadLocal<MyThreadLocalData>();
public static MyThreadLocalData getThreadInstance(){
MyThreadLocalData instance=map.get();
if(instance==null){
instance=new MyThreadLocalData();
map.set(instance);
}
return instance;
}
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;
}
}
由上可知,ThreadLocal是起到了拷贝数据的作用,get相当于get(CurrentId), set 相当于(setCurrentId,ThreadName);
当多个线程需要用到自己内部独立的数据的时候就可以想到ThreadLocal了
如:
第一个小朋友有年龄,班级,姓名
第二个也一样
.....一直到第N个小朋友,他们可以共用一个Student类,但是他们的名字和年龄等属性各不相同。所以可以用到ThreadLocal类了