古詩詞大全網 - 成語解釋 - ThreadLocal如何保證壹個線程只能有壹個Looper?

ThreadLocal如何保證壹個線程只能有壹個Looper?

我們都知道在調用Looper.prepare的時候會創建壹個Looper,那麽是如何保證壹個線程只有壹個Looper的?

首先要知道Looper中有壹個sThreadLocal變量,ThreadLocal用於存儲上下文信息

並且用final static 修飾,所以它是唯壹的內容不可變的

了解sThreadLocal是幹啥用的後,再來看看prepare

先調用sThreadLocal.get()方法

而ThreadLocalMap 是壹個HashMap,那麽取到壹個HashMap後判斷是否為null

如果不存在key為sThreadLocal的節點,得到value = null,並把這個value作為sThreadLocal的值即<sThreadLocal,null>;如果map為null,則創建壹個HashMap並把<sThreadLocal,null>節點加入

這樣get方法就要麽取到壹個Looper,要麽就是null,如果為Looper則拋異常,如果為null,則調用sThreadLocal.set()

其實都是把Looper作為sThreadLocal的value值

回到開頭說的,怎麽保證壹個線程只有壹個Looper?

因為sThreadLocal是線程的上下文,並且唯壹,而線程中存有<sThreadLocal,Looper>key-value鍵值對,所以壹個sThreadLocal對應壹個Looper,並且再次修改Looper是,會拋異常,因為Looper已經存在。

所以壹個線程只有壹個Looper。

如果對HashMap還不了解的同學,這篇文章可能對妳有壹定幫助 HashMap原理