ThreadLocal:線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類(lèi)。
1:我們看下這個(gè)類(lèi)的內(nèi)部有什么東西垦藏。
2:關(guān)注ThreadLocal的幾個(gè)方法
第一:get()
貼下源碼
public T get() {
//獲取當(dāng)前線程
Thread t = Thread.currentThread();
//拿到當(dāng)前線程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
//通過(guò)ThreadLocalMap獲取當(dāng)前ThreadLocal為key的value
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//如果當(dāng)前線程的ThreadLocalMap沒(méi)有被賦值過(guò),那么就通過(guò)
//setInitialValue()方法創(chuàng)建一ThreadLocalMap給于當(dāng)前的線程
return setInitialValue();
}
setInitialValue()方法:說(shuō)明一下這個(gè)方法只會(huì)被ThreadLocal的get方法調(diào)用蝗柔,個(gè)人是這么理解的塘辅,就是我想要獲取Thread的內(nèi)部數(shù)據(jù),但是發(fā)現(xiàn)這個(gè)Thread連放數(shù)據(jù)的容器都沒(méi)有荠商,那么我也不能白來(lái)一次寂恬,索性先給你個(gè)容器,雖然在set()方法里如果判斷當(dāng)前線程的ThreadLocalMap為null也會(huì)也會(huì)去createpMap莱没,別讓我知道你沒(méi)有初肉,知道你沒(méi)有就給你造個(gè)塞給你
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這個(gè)東西,既然是個(gè)map就是個(gè)存數(shù)據(jù)的容器看ThreadLocal的getMap方法
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
他 是Thread里的饰躲,所以他存的數(shù)據(jù)就是當(dāng)前線程的內(nèi)部數(shù)據(jù)牙咏,看上面的set方法拿到當(dāng)前線程的map后會(huì)把當(dāng)前的ThreadLocal為key臼隔,然后吧value存在map里,value是個(gè)泛型妄壶,他是根據(jù)定義的ThreadLocal類(lèi)的泛型為標(biāo)準(zhǔn)摔握,像如果在looper類(lèi)里的是ThreadLocal<Looper>,那么這個(gè)value就是looper丁寄,ActivityThread里的是ThreadLocal<Intent>,那么這個(gè)value就是Intent氨淌。