import java.util.Random;
/**
* ThreadLocal线程范围内共享数据(创建两个线程并存储不同的数据,线程独立)
* @author tanfei
* @date 2012-02-02
*/
public class ThreadLocalTest {
//private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>(); //共享数据集合
private static ThreadLocal<Integer> threadData = new ThreadLocal<Integer>();
private static ThreadLocal<MyThreadLocalData> threadData2 = new ThreadLocal<MyThreadLocalData>();
public static void main(String[] args) {
// TODO Auto-generated method stub
/*创建两个线程*/
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()
+ " put data: " + data);
//threadData.set(data); //将数据放入集合,以便线程操作数据
MyThreadLocalData.getInstance().setName(" [name]" + data);
MyThreadLocalData.getInstance().setAge(data);
new A().get();
new B().get();
}}).start();
}
}
static class A
{
public void get()
{
/*int data = threadData.get(); //根据当前线程取得数据
System.out.println("A from " + Thread.currentThread().getName()
+ " get data:" + data);*/
System.out.println("A from " + Thread.currentThread().getName()
+ " mydata: " + threadData2.get().getName());
}
}
static class B
{
public void get()
{
/*int data = threadData.get();
System.out.println("B from " + Thread.currentThread().getName()
+ " get data: " + data);*/
System.out.println("B from " + Thread.currentThread().getName()
+ " mydata: " + threadData2.get().getName());
}
}
static class MyThreadLocalData{
private MyThreadLocalData()
{
}
public static MyThreadLocalData getInstance()
{
MyThreadLocalData instance = threadData2.get();
if(instance == null)
{
instance = new MyThreadLocalData();
threadData2.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线程范围内共享数据
最新推荐文章于 2024-07-22 19:54:51 发布