V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Android

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

  •  
  •   nnegier · 2019-09-12 16:56:04 +08:00 · 11971 次点击
    这是一个创建于 1928 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    特来问问

    第 1 条附言  ·  2020-01-11 10:33:35 +08:00
    问题本身是错误的。没有什么所谓的线程的切换。Looper 将一个线程变成异步处理线程,就是线程内部有一个 while(true),有消息就调用回掉函数,没有就 wait。Handler 只是一个用于收发消息的作用。
    7 条回复    2020-11-12 19:11:33 +08:00
    blackboom
        1
    blackboom  
       2019-09-12 17:10:53 +08:00
    码上开学,有一节讲的不错
    https://www.bilibili.com/video/av49582369
    merpyzf
        2
    merpyzf  
       2019-09-12 17:36:01 +08:00   ❤️ 1
    因为 Handler 的 dispatchMessage 方法是在创建 Handler 的线程中的 Looper 内部调用的,因此 Looper 所处的线程也就决定了你 Handler 提交任务执行所在的线程。
    Vdream
        3
    Vdream  
       2019-09-12 17:43:15 +08:00
    sendMessage 其实是把自己也传过去了 handler 回调就知道是谁了
    bccoder
        4
    bccoder  
       2019-09-12 20:50:10 +08:00   ❤️ 1
    handler 所属线程的 Looper 会将 msg 从 msgqueue 中取出然后执行相关逻辑。
    mxalbert1996
        5
    mxalbert1996  
       2019-09-12 23:06:01 +08:00 via Android
    楼主是不是对 ThreadLocal 有什么误解? ThreadLocal 就是用来存线程内变量的,通过 ThreadLocal 获取别的线程的变量是什么鬼。。。
    eminemcola
        6
    eminemcola  
       2019-09-18 13:32:01 +08:00
    楼主的问题核心在于线程的「切换」。而我认为 handler 本身并不负责线程的「切换」,它是只负责了消息的收发。
    ysy950803
        7
    ysy950803  
       2020-11-12 19:11:33 +08:00
    上面的附言说得对,而且网上一堆长篇大论的都没说到要点,一会儿扯什么 ThreadLocal 一会儿又是 IPC 。
    在 B 线程调用 A 线程的 Handler 来发消息,这特么当然就跨线程了啊,就这么简单。服务端开发里面的消息队列本身也是这个原理,队列对所有线程都是可见的,大家都可以往里面 enqueue 消息。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.