-
Choreorgapher
-
原理
-
每一个线程都有一张表,其实就是一个数组,key和value都存储在数组中
-
key存储在weakReference中,value对应对象如Looper、Choreorgapher等
-
一个应用里可以定义多个ThreadLocal,ThreadLocal都有自己的哈希值,哈希值根据hashCounter计算
-
算出hash值之后,对表的size取余数,就能算出key:value在表中的index值
-
如果发生了hash冲突,就会从当前index开始向下遍历数组,放在空闲的位置上
-
代码如下:
总结
-
同一个ThreadLocal对象,在不同线程get返回不同value
-
Thread对象里有张表,保存ThreadLocal到value的映射关系
-
这张表是怎么实现的?(见上面的原理分析)
-
是如何解决hash冲突的?(见上面的原理分析)
3. 说说Looper的副业(待完善)
-
Looper里可以监听其它描述符
-
创建管道,跨进程传数据,用looper监听描述符事件
4. 怎么检查线程有耗时任务
两种情况
-
正常的,轻微阻塞
-
不正常的,严重阻塞
检测机制
-
WatchDog:
-
Framework自带,检查system_server中系统服务是否正常
-
用于检查死锁或者线程异常
-
BlockCanary
-
开源框架,用于检