//定义一个存放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就是当前线程呢? |