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

news/2025/11/7 14:05:55/文章来源:https://www.cnblogs.com/slgkaifa/p/19199512

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()触发处理
工作流程
并发安全实现机制

当多线程同时操作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) {          // 获取锁后操作队列
// ... 查找可用Message
if (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()) {
@Override
public void handleMessage(Message msg) {
String data = (String) msg.obj;
textView.setText(data); // 更新UI
}
};

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB生成雷达脉冲信号

一、基础脉冲信号生成 1. 矩形脉冲生成 % 参数设置 fs = 1e9; % 采样频率 (Hz) Tp = 1e-6; % 脉冲宽度 (s) fc = 10e9; % 载波频率 (Hz) t = 0:1/fs:2*Tp; % 时间向量 (包含脉冲前后各…

2025年食品级消毒酒精权威推荐榜单:免洗速干手消毒液/卫生手消毒液/国产消毒液源头厂家精选

在食品加工与餐饮行业,一瓶安全高效的食品级消毒酒精,是保障卫生安全的隐形守护者。 食品级消毒酒精作为食品安全生产的关键防护产品,其纯度标准与生产工艺直接关系到食品安全和消费者健康。随着全球对食品安全要求…

「机器学习笔记7」决策树学习:从理论到实践的全面解析(上) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微算法科技(NASDAQ MLGO)基于PoS的跨链桥接协议(PoS-BCP):重塑区块链互操作生态

区块链技术的快速发展催生了多元的链上生态,从公链到联盟链,从通用型区块链到垂直领域专用链,不同网络在架构设计、共识机制与功能定位上呈现显著差异。这种多样性虽推动了行业创新,却也导致“数据孤岛”现象——资…

axios 请求错误重复请求

一、实现: import axios from "axios"; import type { InternalAxiosRequestConfig, AxiosResponse, AxiosInstance } from "axios";// 创建Axios实例 const axiosInstance: AxiosInstance = axi…

2025年磷酸氢二钠供货厂家权威推荐榜单:磷酸二氢钠/草酸/磷酸氢二钾源头厂家精选

在化工、食品、医药及水处理等行业持续发展的推动下,磷酸氢二钠作为重要的基础化工原料,其市场供应稳定性与产品质量已成为下游用户关注的核心。行业数据显示,2024年中国磷酸盐市场规模已突破200亿元,其中食品级磷…

GNU Radio (二) 2FSK 信号 发送

GNU Radio (二) 2FSK 信号 发送 一、官方 demo Simulation example: FSK - GNU Radio二、FSK

升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(Redis + 翻译表 + 模糊匹配)》

升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(Redis + 翻译表 + 模糊匹配)》 一、方案概述 本方案旨在实现商品模块的多语言查询与显示一体化。通过结合 Redis 缓存与数据库翻译表(sys_dynamic_trans…

2025年无风感空调品牌权威推荐榜单:省电空调/小户型空调/防直吹空调源头厂家精选

在追求舒适生活的今天,一股没有直吹感的柔和气流,正是现代空调技术送给家庭的最佳礼物。 无风感空调作为空调领域的技术创新成果,其气流控制技术与舒适度表现直接关系到用户的体验满意度。随着消费者对室内环境舒适…

基于稀疏表示分类器的高光谱图像分类MATLAB实现

基于稀疏表示分类器(Sparse Representation Classifier, SRC)的高光谱图像分类MATLAB实现一、架构 1. 算法流程二、核心代码 1. 数据加载与预处理 %% 数据加载(ENVI格式) hdr = read_envihdr(Indian_pines.hdr); %…

【能源行业案例】借助TeeChart图表库,将地质数据转化为清晰的见解

自2007年以来,GeoLogismiki一直使用TeeChart Pro VCL/FMX图表库将复杂的数据转化为清晰、交互式的图形。将地质数据转化为清晰的见解 GeoLogismiki是一家总部位于希腊的公司,致力于为地质学家、工程师和环境专业人士…

地图上色

地图上色数据源地级市 地区生产总值(GDP)苏州市 26727.00南京市 18500.81无锡市 16263.29南通市 12421.90常州市 10813.60徐州市 10000.00扬州市 7809.64盐城市 7779.20泰州市 7020.95镇江市 5540.01淮安市 5413.02宿…

TCP快速打开TFO

以上仅供参考,如有疑问,留言联系

2025年双出风中央空调品牌权威推荐榜单:中央空调选购/省电中央空调/6赫兹中央空调源头厂家精选

在现代家居与商业空间中,一股柔和而均匀的气流往往是衡量空调系统品质的隐形标尺。 随着人们对室内环境舒适度要求的不断提高,双出风中央空调以其优越的气流分布能力和温度控制精度,正成为高端住宅和商业空间的首选…

模拟赛SXJ202511061800比赛记录题解

题目请看 最近被一些模拟赛蹂躏了,这场是来思路来的最快的一场比赛T1So easy,but...很简单,判差值和数量即可,我却漏了细节,82point,磕细节磕了1h,才想出正解,64行贴一下代码 /* User:Kevinrzy103874 Uid:72 Ag…

2025年山东开锁培训学校权威推荐榜单:汽车开锁培训/开锁技术培训/培训汽车开锁源头机构精选

一把钥匙开一把锁,但一名专业的锁匠却能开启千百种锁具,这背后是系统化培训与专业技能的结晶。 随着社会对专业开锁服务需求的日益增长,锁具修理工已成为现代城市服务中不可或缺的技术工种。据统计,中国锁具行业年…

2025年绝缘油滤油机直销厂家权威推荐榜单:润滑油滤油机/真空抽气机组/透平油滤油机设备源头厂家精选

在电力、冶金、石化等工业领域,一滴纯净的绝缘油是设备安全运行的命脉,而滤油机正是这命脉的守护者。 绝缘油滤油机作为工业油品净化的关键设备,其技术水平与过滤精度直接关系到大型机械设备的运行安全与使用寿命。…

国产化文档开发组件Spire.Office 10.10 全新发布!多项文档处理能力重磅升级

近日,国产化文档开发组件Spire.Office 同步更新 .NET和 Java 版本至10.10.0 !本次更新带来了多项全新功能与性能优化,为开发者提供更强大、更高效的文档、表格、PDF、演示文稿处理能力。近日,知名国产化文档开发组…

K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与处理全解析

K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与处理全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

fastutil 实战指南:用原始类型集合把性能“薅满”

当你在 Java 里用 `Map<Integer, Double>`、`Set<Long>`、`List<Integer>` 处理大数据,会被装箱/拆箱与对象头开销“慢到怀疑人生”。fastutil 针对每种原始类型提供成套集合与工具(int/long/doub…