标题: 关于ThreadLocal [打印本页] 作者: 王阳 时间: 2012-11-28 20:43 标题: 关于ThreadLocal //定义一个存放Integer类型的ThreadLocal
static ThreadLocal<Integer> map = new ThreadLocal<Integer>();
public static void main(String[] args) {
//启动两个线程并在run方法中得到一个随机数
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
//打印出当前线程语句和随机数,然后将随机数保存至ThreadLocal
System.out.println(Thread.currentThread().getName()+"is put data "+data);
System.out.println(map.toString());
map.set(data);
//调用TestA和TestB的show方法
new TestA().show();
new TestB().show();
}
}).start();
}
}
//定义两个内部类并获取各自线程的ThreadLocal保存的变量的值,然后打印输出语句
static class TestA{
public void show(){
int number = map.get();
System.out.println("TestA"+Thread.currentThread().getName()+" "+number);
}
}
static class TestB{
public void show(){
int number = map.get();
System.out.println("TestB"+Thread.currentThread().getName()+" "+number);
}
}
}
在run方法内,只有map.set(data)方法,但是ThreadLocal的源码的set方法,是通过一个this为key将值保存进去的,那如果才能确定那个this就是当前线程呢?作者: 婂埖糖 时间: 2012-11-28 20:53
每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象,将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象。 作者: 王阳 时间: 2012-11-29 19:38