import java.util.Random;
public class ThreadLocalTest {
//一个threadlocal代表一个变量
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);
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()+ " get mydata ["+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.get();
System.out.println("A from "+Thread.currentThread().getName()+ " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
}
}
}
/**
* threadLocal存储多个变量,封装成一个实体
* @author ETHAN
*
*/
class 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 :1763666590
Thread-1 has put data :1672527073
A from Thread-0 get data : 1763666590
A from Thread-0 get mydata [name1763666590---1763666590]
A from Thread-1 get data : 1672527073
A from Thread-1 get mydata [name1672527073---1672527073]
B from Thread-0 get data : 1763666590
B from Thread-1 get data : 1672527073
A from Thread-0 get mydata [name1763666590---1763666590]
A from Thread-1 get mydata [name1672527073---1672527073]
import java.util.Random;
public class ThreadLocalTest2 {
//一个threadlocal代表一个变量
private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
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);
MyThreadScopeData2.getInstance().setName("name"+data);
MyThreadScopeData2.getInstance().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);
MyThreadScopeData2 myData = MyThreadScopeData2.getInstance();
System.out.println("A from "+Thread.currentThread().getName()+ " get mydata ["+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);
MyThreadScopeData2 myData = MyThreadScopeData2.getInstance();
System.out.println("A from "+Thread.currentThread().getName()+ " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
}
}
}
/**
* threadLocal存储多个变量,封装成一个实体
* 这就是一个容器,装着个各线程的变量,比如struts2
* 线程死掉后,value remove()
* 线程何时死亡,不可知
* 如果线程结束了,ThreadLocal会自动remove
* @author ETHAN
*
*/
class MyThreadScopeData2 {
private static ThreadLocal<MyThreadScopeData2> map = new ThreadLocal<MyThreadScopeData2>();
private MyThreadScopeData2() {}
//threadLocal每个线程 取各自的,不相干
public static /*synchronized*/ MyThreadScopeData2 getInstance() {
//从threadlocal中拿
MyThreadScopeData2 instance= map.get();
if(instance==null) {
instance = new MyThreadScopeData2();
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;
}
}
运行结果:
Thread-0 has put data :703649381
Thread-1 has put data :1447231087
A from Thread-0 get data : 703649381
A from Thread-1 get data : 1447231087
A from Thread-0 get mydata [name703649381---703649381]
A from Thread-1 get mydata [name1447231087---1447231087]
B from Thread-0 get data : 703649381
B from Thread-1 get data : 1447231087
A from Thread-0 get mydata [name703649381---703649381]
A from Thread-1 get mydata [name1447231087---1447231087]