1.ThreadLocal
在ThreadLocal中我們主要關(guān)注的三個(gè)地方

image.png
- ThreadLocalMap
ThreadLocalMap 在哪里定義 ,在哪里引用?
ThreadLocalMap的定義在ThreadLocal中但是他的引用是在Thread中
ThreadLocalMap的Key是什么,適應(yīng)ThreadID行不行 為什么?
ThreadLocalMap的Key是ThreadLocal對(duì)象 value為用戶的值
不能使用ThreadId 因?yàn)槿绻褂肨hreadId作為key那面一個(gè)Thread的ThreadMap就只能保存一個(gè)對(duì)象了 不能在保存第二個(gè)對(duì)象,而使用ThreadLocal對(duì)象作為key 那么在一個(gè)Thread的ThreadMap中是可以保存多個(gè)ThreadLocal 對(duì)象的 - ThreadLocal的作用
ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程的生命周期內(nèi)起作用。作用:提供一個(gè)線程內(nèi)公共變量(比如本次請(qǐng)求的用戶信息),減少同一個(gè)線程內(nèi)多個(gè)函數(shù)或者組件之間一些公共變量的傳遞的復(fù)雜度,或者為線程提供一個(gè)私有的變量副本,這樣每一個(gè)線程都可以隨意修改自己的變量副本,而不會(huì)對(duì)其他線程產(chǎn)生影響
2.handler的模型

image.png
3.Looper
-
Looper的創(chuàng)建時(shí)間
image.png
在App啟動(dòng)的時(shí)候在ActivityThread.Main()方法中調(diào)用 Looper.prepareMainLooer()創(chuàng)建
Looper.looper()
public static void loop() {
final Looper me = myLooper(); //獲取TLS存儲(chǔ)的Looper對(duì)象
final MessageQueue queue = me.mQueue; //獲取Looper對(duì)象中的消息隊(duì)列
Binder.clearCallingIdentity();
//確保在權(quán)限檢查時(shí)基于本地進(jìn)程,而不是調(diào)用進(jìn)程。
final long ident = Binder.clearCallingIdentity();
for (;;) { //進(jìn)入loop的主循環(huán)方法
Message msg = queue.next(); //可能會(huì)阻塞
if (msg == null) { //沒(méi)有消息,則退出循環(huán)
return;
}
//默認(rèn)為null,可通過(guò)setMessageLogging()方法來(lái)指定輸出,用于debug功能
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg); //用于分發(fā)Message
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
//恢復(fù)調(diào)用者信息
final long newIdent = Binder.clearCallingIdentity();
msg.recycleUnchecked(); //將Message放入消息池
}
}
loop()進(jìn)入循環(huán)模式,不斷重復(fù)下面的操作,直到?jīng)]有消息時(shí)退出循環(huán)
讀取MessageQuene的下一條messahe
把Meaasge分發(fā)給對(duì)應(yīng)target
把分發(fā)后Message回收到消息池,以便重復(fù)利用
4.Handler
消息發(fā)送調(diào)用鏈

image.png
5.MessageQueue
消息隊(duì)列 消息機(jī)制的核心 也是java層與native層之間的紐帶
他涉及到的native的方法有
private native static long nativeInit();
private native static void nativeDestroy(long ptr);
private native void nativePollOnce(long ptr, int timeoutMillis);
private native static void nativeWake(long ptr);
private native static boolean nativeIsPolling(long ptr);
private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);
