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

Looper、MessageQueue、Message及Handler的关系是什么?如何保证MessageQueue的并发访问安全?

更多面试题请看这里:https://interview.raoyunsoft.com/

核心组件关系
  1. Message
    消息的载体,包含任务数据和目标Handler信息。它在Handler机制中贯穿始终,本质是一个链表节点。

  2. Handler
    对外的操作接口,主要职责:

    • 生产者:通过sendMessage()/post()向MessageQueue发送消息
    • 处理器:在目标线程执行handleMessage()回调处理任务
    • 内存管理:通过obtain()复用Message对象减少内存分配
  3. MessageQueue
    消息容器,本质是优先级队列(按when时间排序)。核心能力:

    • 消息入队:enqueueMessage()
    • 消息出队:next()
    • 空闲任务管理:addIdleHandler()
  4. Looper
    消息循环引擎,关键作用:

    • 消费者:通过loop()无限循环调用queue.next()取消息
    • 线程绑定:通过ThreadLocal实现线程单例
    • 消息分发:调用msg.target.dispatchMessage()触发处理
工作流程
Handler发送Message
Message入队
MessageQueue
Looper循环
Message出队
Handler.handleMessage
并发安全实现机制

当多线程同时操作MessageQueue(生产者线程入队,Looper线程出队),通过同步锁+等待释放策略避免死锁:

关键代码实现

// 入队操作(生产者线程)
boolean enqueueMessage(Message msg, long when) {synchronized (this) { // 获取互斥锁// ... 消息插入队列逻辑if (needWake) nativeWake(ptr); // 唤醒Looper线程}return true;
}// 出队操作(Looper线程)
Message next() {for (;;) {nativePollOnce(ptr, timeout); // 释放CPU进入等待(不持有锁!)synchronized (this) {          // 获取锁后操作队列// ... 查找可用Messageif (msg != null) return msg;}}
}

安全机制详解

  1. 锁分离设计

    • synchronized(this)保护队列操作临界区
    • nativePollOnce()在同步块外部执行等待
  2. 避免死锁流程

    生产者线程MessageQueueNative层Looper线程尝试获取锁获得锁插入消息nativeWake()释放锁nativePollOnce() 等待唤醒(收到event)尝试获取锁获得锁取出消息释放锁生产者线程MessageQueueNative层Looper线程
  3. Native层协作

    • nativePollOnce():通过Linux epoll机制释放CPU
    • nativeWake():向eventfd写入数据触发唤醒

关键点:当队列为空时,Looper在nativePollOnce()中释放CPU资源并等待,此时不持有Java层锁,允许生产者线程随时入队新消息。唤醒后重新竞争锁执行出队操作。

典型应用场景
// 工作线程发送任务
new Thread(() -> {Message msg = handler.obtainMessage();msg.obj = "Data from worker";handler.sendMessage(msg); // 安全入队
}).start();// 主线程Handler处理
Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {String data = (String) msg.obj;textView.setText(data); // 更新UI}
};

这种机制保证了跨线程通信的安全性和高效性,是Android事件驱动的核心基础。

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

相关文章:

  • ELK运维之路(Elasticsearch7集群组建-7.17.24)
  • 网站建设管理工作总结室外平台设计
  • OpenShift Virtualization - 为使用 ovn-k8s-cni-overlay 类型网络的 VM 自动分配 IP 地址
  • 投资建设个什么网站好网络设计实践课程报告
  • 柳州住房和城乡建设局网站在深圳注册公司需要什么条件
  • Java 并发编程中的 CLH 队列
  • 客服AI软件如何成为电商店铺的“隐形增长官“
  • 世纪龙科技-汽车玻璃升降器更换及车门调整仿真教学软件介绍
  • 友达G156HAN04.0工业宽温液晶模组技术摘要
  • 推荐西安知名的集团门户网站建设公司南京调查公司网站
  • 国际化(货币单位、时间、数字)
  • next项目如何实现不同页面使用不同的布局结构,比如login不使用全局的layout
  • dnf游戏币交易网站建设网站app简单做
  • 服务器操作手册(四)nacos搭建+redis搭建+nexus搭建
  • LoadRunner2022 社区版下载及安装教程 + 中文版教程,内附安装包
  • CC防护的实时监控与响应机制
  • 长沙网站柯林建站程序
  • 唐山网站搭建wordpress 分页按钮 显示文章数
  • html怎么做网站地图卓越职业院校建设专题网站
  • Debezium日常分享系列之:使用 Debezium 添加新表:最佳实践和陷阱
  • flash个人网站源码西安是哪个省属于哪个市
  • 东莞h5网站开发网站内部链接是怎么做的
  • 做网站每年包多少流量网站开发专业简历
  • 台州市临海建设局网站四川集团网站建设
  • 第十八篇:变量作用域(Local, Enclosing, Global, Built-in)与global、nonlocal关键字
  • 寻梦数据空间 | 内核篇:新一代数据空间的四大核心能力解析
  • 企业网站定制开发流程wordpress淘宝客 瀑布流
  • 一款简单易用的机器人流程自动化桌面软件
  • 视频网站开发者工具长春网页设计培训
  • 网站建设优化seowordpress设置专题页