Handler 是怎么完成线程切换的?

2019-09-12 16:56:04 +08:00
 nnegier

这是我的理解,面试官说我没讲清楚,自己也觉得模糊: “当然是借助 ThreadLocal 啦。 通过 ThreadLocal 可以获得主线程的 Looper 和 MessageQueue。 主线程的 Looper 一直在主线程里面无限循环。”

特来问问

11490 次点击
所在节点    Android
7 条回复
blackboom
2019-09-12 17:10:53 +08:00
码上开学,有一节讲的不错
https://www.bilibili.com/video/av49582369
merpyzf
2019-09-12 17:36:01 +08:00
因为 Handler 的 dispatchMessage 方法是在创建 Handler 的线程中的 Looper 内部调用的,因此 Looper 所处的线程也就决定了你 Handler 提交任务执行所在的线程。
Vdream
2019-09-12 17:43:15 +08:00
sendMessage 其实是把自己也传过去了 handler 回调就知道是谁了
bccoder
2019-09-12 20:50:10 +08:00
handler 所属线程的 Looper 会将 msg 从 msgqueue 中取出然后执行相关逻辑。
mxalbert1996
2019-09-12 23:06:01 +08:00
楼主是不是对 ThreadLocal 有什么误解? ThreadLocal 就是用来存线程内变量的,通过 ThreadLocal 获取别的线程的变量是什么鬼。。。
eminemcola
2019-09-18 13:32:01 +08:00
楼主的问题核心在于线程的「切换」。而我认为 handler 本身并不负责线程的「切换」,它是只负责了消息的收发。
ysy950803
2020-11-12 19:11:33 +08:00
上面的附言说得对,而且网上一堆长篇大论的都没说到要点,一会儿扯什么 ThreadLocal 一会儿又是 IPC 。
在 B 线程调用 A 线程的 Handler 来发消息,这特么当然就跨线程了啊,就这么简单。服务端开发里面的消息队列本身也是这个原理,队列对所有线程都是可见的,大家都可以往里面 enqueue 消息。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/600442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX