ThreadLocal:线程内部的数据存储类。
1:我们看下这个类的内部有什么东西。
ThreadLocal1.png
2:关注ThreadLocal的几个方法
第一:get()
贴下源码
public T get() {
//获取当前线程
Thread t = Thread.currentThread();
//拿到当前线程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
//通过ThreadLocalMap获取当前ThreadLocal为key的value
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//如果当前线程的ThreadLocalMap没有被赋值过,那么就通过
//setInitialValue()方法创建一ThreadLocalMap给于当前的线程
return setInitialValue();
}
setInitialValue()方法:说明一下这个方法只会被ThreadLocal的get方法调用,个人是这么理解的,就是我想要获取Thread的内部数据,但是发现这个Thread连放数据的容器都没有,那么我也不能白来一次,索性先给你个容器,虽然在set()方法里如果判断当前线程的ThreadLocalMap为null也会也会去createpMap,别让我知道你没有,知道你没有就给你造个塞给你
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
set方法:看一哈就可以了
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
然后就是ThreadLocalMap这个东西,既然是个map就是个存数据的容器看ThreadLocal的getMap方法
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
他 是Thread里的,所以他存的数据就是当前线程的内部数据,看上面的set方法拿到当前线程的map后会把当前的ThreadLocal为key,然后吧value存在map里,value是个泛型,他是根据定义的ThreadLocal类的泛型为标准,像如果在looper类里的是ThreadLocal<Looper>,那么这个value就是looper,ActivityThread里的是ThreadLocal<Intent>,那么这个value就是Intent。