当前位置: 首页 > news >正文

Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么?

更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅

核心矛盾点

主线程的 Looper.loop() 是一个死循环,理论上会阻塞线程。但实际使用中,UI 操作(如滑动列表、执行动画)仍能流畅响应,这背后的机制值得深究。

关键原理:阻塞与唤醒的动态平衡
  1. 消息队列的空转阻塞

    • MessageQueue 为空时,next() 方法通过 nativePollOnce() 将线程挂起(底层使用 Linux epoll 机制),释放 CPU 资源
    • 此时线程处于 WAITING 状态,不消耗计算资源,类似「休眠」。
  2. 系统级唤醒机制

    唤醒时机触发方式作用
    屏幕刷新信号 (VSync)Choreographer 接收 16.6ms 垂直同步信号通过 FrameDisplayEventReceiver 向主线程发送 MSG_VSYNC
    用户输入事件触摸/按键事件由 InputManagerService 传递向主线程队列插入 INPUT_EVENT 消息
    系统广播如网络状态变化、电量低等通过 BroadcastQueue 分发消息
  3. 底层通信机制

    • 管道(Pipe)
      • 创建两个文件描述符(读/写端)
      • MessageQueue 为空时,线程阻塞在读端
      • 新消息到达时,通过 nativeWake()写端写入数据,唤醒读端线程
    • epoll 多路复用
      • 高效监控多个文件描述符
      • 仅当管道中有数据可读时唤醒线程,避免 CPU 空转
为什么 UI 操作不被阻塞?
VSync信号
Choreographer
发送MSG_VSYNC
主线程MessageQueue
唤醒Looper
执行View绘制
  1. 屏幕刷新驱动消息
    • 每 16.6ms 的 VSync 信号强制插入绘制消息,保证主线程定期被唤醒
  2. 输入事件优先处理
    • 用户触摸事件会触发 INPUT_EVENT 消息,实时中断阻塞状态
  3. 阻塞粒度可控
    • 挂起时仅等待新消息,唤醒后立即执行消息队列中的任务(包括 UI 重绘)
代码验证:子线程 Looper 阻塞
new Thread(() -> {Log.d("Thread", "ID: " + Thread.currentThread().getId());Looper.prepare();Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {Log.d("Handler", "处理消息: " + msg.what);}};Log.w("Looper", "loop() 之前"); // 会执行Looper.loop(); Log.w("Looper", "loop() 之后"); // ❌ 永不执行!
}).start();

结论Looper.loop() 后的代码无法执行,证明线程确实被阻塞在消息循环内。

关键设计思想
  • 事件驱动架构:用阻塞代替 CPU 轮询,大幅降低空载功耗
  • 优先级调度:系统消息(VSync/输入)可抢占普通消息执行
  • 零空闲占用:无消息时线程挂起,100% 释放 CPU 资源

这就是 Android 能在单线程模型中同时处理 UI、网络、广播等任务的底层基石。

http://www.dtcms.com/a/512224.html

相关文章:

  • 【连接器专题】USB充电线通用技术要求团体标准笔记
  • 【小白笔记】虚拟货币挖矿算力匹配
  • 威胁系统(Threat System)概述
  • vue 大型网站开发让网站对搜索引擎友好
  • Blazor核心:Razor组件开发全解析
  • 服务好的合肥网站建设网站开发运作
  • 下载安装sqlite
  • DAX中的MMM月份格式按排序列进行排序
  • python不用框架做网站xps13适合网站开发吗
  • wordpress 多站点 主站点wordpress网站放icp
  • Angular如何让整个项目的所有页面能够整体缩小一定的比例?
  • 深入理解 Java 中的字符串、包装类与日期处理
  • 条件竞争漏洞全解析:从原理到突破
  • 面试_场景方案设计_联系
  • 判断网站首页阿里巴巴做网站营销有没有用
  • uniapp 请求携带数据 \\接口传值 \\ map遍历数据
  • 宝安沙井网站建设网站开发证书
  • 物联网卡为什么要支持双栈
  • 国外美容院网站建设监理工程师网站
  • 一键修复工具背后的机制:如何自动解决常见网络故障
  • MySQL 创建和授权用户
  • 遥控器KC模块技术解析
  • 申请域名建立网站做网站需要购买网站空间吗
  • 网页的创新型网站策划陵川网站建设
  • 个人网站备案代理wordpress文章发布函数
  • 陕西省建设厅网站wap网站开发视频教程
  • 网站开发过程有几个阶段溧水网站建设
  • C++11----模板可变参数
  • 怎么做网站数据库备份公众号软文推广多少钱一篇
  • triton backend 模式docker 部署 pytorch gpu模型 镜像选择