政府网站建设申论/站长工具中文

政府网站建设申论,站长工具中文,网站建设理论依据,视频制作网站素材目录 一、MessageQueue 的线程安全实现 1. 消息队列的同步锁(synchronized) 2. 消息顺序与延时处理 二、底层唤醒机制:从 Java 到 Linux 内核 1. 消息插入后的唤醒逻辑 2. Native 层实现(基于 Linux 的 eventfd 和 epoll&am…

目录

一、MessageQueue 的线程安全实现

1. 消息队列的同步锁(synchronized)

2. 消息顺序与延时处理

二、底层唤醒机制:从 Java 到 Linux 内核

1. 消息插入后的唤醒逻辑

2. Native 层实现(基于 Linux 的 eventfd 和 epoll)

三、完整流程:跨线程通信的步骤分解

四、设计优势与性能考量

五、总结

相关推荐


        Android 中的 Handler 跨线程通信机制 依赖于两个核心设计:线程安全的 MessageQueue 和 高效的底层唤醒机制。以下是详细的分步解析:

一、MessageQueue 的线程安全实现

1. 消息队列的同步锁(synchronized)
  • 关键方法 enqueueMessage()
    当通过 Handler 发送消息(如 sendMessage() 或 post())时,最终会调用 MessageQueue.enqueueMessage() 方法将消息插入队列。
    // 源码简化示例(Android SDK)
    boolean enqueueMessage(Message msg, long when) {synchronized (this) {  // 同步锁,确保原子性操作// 将消息按时间顺序插入队列// ...if (needWake) {nativeWake(mPtr); // 唤醒目标线程的 Looper}}return true;
    }// 源码简化示例(Android SDK)boolean enqueueMessage(Message msg, long when) {// 消息合法性检查:每个消息必须绑定一个 Handler(即 msg.target),否则无法确定消息由谁处理。if (msg.target == null) {throw new IllegalArgumentException("Message must have a target.");}synchronized (this) {// 同步锁,确保原子性操作if (msg.isInUse()) {// 防止消息被重复插入队列(如已被回收或正在处理)throw new IllegalStateException(msg + " This message is already in use.");}if (mQuitting) {IllegalStateException e = new IllegalStateException(msg.target + " sending message to a Handler on a dead thread");Log.w(TAG, e.getMessage(), e);msg.recycle();// 回收消息并记录错误return false;}msg.markInUse();msg.when = when;Message p = mMessages;boolean needWake;if (p == null || when == 0 || when < p.when) {// 队列为空(p == null)// 消息需立即执行(when == 0)// 消息执行时间早于当前队首消息(when < p.when)msg.next = p;mMessages = msg;needWake = mBlocked;//唤醒队列if (p == null) {mLast = mMessages;}} else {// 若启用尾部跟踪(mLast 指向队列尾部),直接操作尾部指针提升插入效率if (Flags.messageQueueTailTracking()) {if (when >= mLast.when) {needWake = needWake && mAsyncMessageCount == 0;msg.next = null;mLast.next = msg;mLast = msg;} else {// Inserted within the middle of the queue.Message prev;for (;;) {prev = p;p = p.next;if (p == null || when < p.when) {break;}if (needWake && p.isAsynchronous()) {needWake = false;}}if (p == null) {/* Inserting at tail of queue */mLast = msg;}msg.next = p; // invariant: p == prev.nextprev.next = msg;}} else {Message prev;// 通过遍历链表找到插入位置for (;;) {prev = p;p = p.next;if (p == null || when < p.when) {break;// 找到插入位置}// 若存在异步消息,可能抑制唤醒if (needWake && p.isAsynchronous()) {needWake = false;}}msg.next = p; // invariant: p == prev.nextprev.next = msg;mLast = null;}}if (msg.isAsynchronous()) {// 异步消息(如 ViewRootImpl 的绘制任务)可绕过同步屏障(Sync Barrier),优先执行。mAsyncMessageCount++;//异步消息计数}// needWake == true,表示目标线程的 Looper 处于阻塞状态(mBlocked == true),需要唤醒以处理新消息。if (needWake) {nativeWake(mPtr);// 调用 Native 层唤醒}}return true;}
    • 同步锁的作用
      synchronized (this) 确保同一时间只有一个线程可以操作 MessageQueue,防止多线程并发插入消息时出现数据竞争(如队列链表断裂、消息丢失等问题)。
设计目标实现手段
线程安全synchronized 锁保护队列操作
消息顺序性按 when 时间排序的链表结构
高效唤醒eventfd + epoll 实现精准唤醒,避免忙等待
异步消息优先级通过同步屏障和异步消息计数优先处理高优先级任务
内存安全消息回收(msg.recycle())、退出状态检查(mQuitting
2. 消息顺序与延时处理
  • 消息按时间戳排序
    每个消息携带一个时间戳(when),MessageQueue 按时间顺序维护消息链表,确保延时消息(如 postDelayed())按预期执行。
  • 同步屏障(Sync Barrier)
    通过 postSyncBarrier() 插入同步屏障消息,可临时阻塞普通消息,优先处理异步消息(如 UI 渲染相关的高优先级任务)。

二、底层唤醒机制:从 Java 到 Linux 内核

1. 消息插入后的唤醒逻辑
  • 何时需要唤醒目标线程
    • 当消息插入到队列头部(即下一个待处理消息)时。
    • 当目标线程的 Looper 处于休眠状态(队列此前为空)。
  • 调用 nativeWake()
    enqueueMessage() 中通过 nativeWake(mPtr) 触发底层唤醒操作,mPtr 是 Native 层 MessageQueue 的指针。
2. Native 层实现(基于 Linux 的 eventfd 和 epoll)
  • nativeWake() 的 JNI 映射
    Java 层的 nativeWake() 对应 Native 层的 android_os_MessageQueue_nativeWake(),最终调用 Looper::wake()

    // Native 层代码(简化)
    void Looper::wake() {uint64_t inc = 1;write(mWakeEventFd, &inc, sizeof(uint64_t)); // 向 eventfd 写入数据
    }
    
  • eventfd:轻量级线程间通知机制

    • mWakeEventFd 是一个 eventfd 文件描述符,由 Looper 在初始化时创建。
    • 写入数据到 eventfd 会触发监听该文件描述符的线程唤醒。
  • epoll:I/O 多路复用监听事件

    // Looper 的主循环(pollOnce)
    int result = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);
    if (result > 0) {if (eventItems[0].data.fd == mWakeEventFd) {read(mWakeEventFd, &counter, sizeof(uint64_t)); // 消费 eventfd 数据}// 处理其他事件(如 Input 事件、Binder 调用等)
    }
    
    • Looper 在消息循环中通过 epoll_wait() 监听 mWakeEventFd
    • 当其他线程调用 nativeWake() 写入数据时,epoll_wait() 返回,目标线程被唤醒,继续从 MessageQueue 中取出消息处理。

三、完整流程:跨线程通信的步骤分解

  1. 发送消息
    线程 A 调用 handler.sendMessage(msg),通过 enqueueMessage() 将消息插入线程 B 的 MessageQueue

    • 通过 synchronized 锁保证线程安全。
    • 若需要唤醒线程 B,触发 nativeWake()
  2. 底层唤醒
    nativeWake() 向线程 B 的 mWakeEventFd 写入数据,触发 epoll_wait() 返回,线程 B 退出休眠状态。

  3. 消息处理
    线程 B 的 Looper 调用 MessageQueue.next() 取出消息,分发给对应的 Handler.handleMessage() 处理。

四、设计优势与性能考量

  1. 线程隔离性

    • MessageQueue 严格绑定到线程,通过锁和底层唤醒机制隔离多线程操作。
    • 开发者无需手动处理线程同步问题。
  2. 高效性

    • 使用 epoll 和 eventfd 避免了忙等待(busy waiting),减少 CPU 空转。
    • 消息按时间排序,支持延时消息和优先级控制。
  3. 低延迟与高吞吐

    • 通过 epoll 多路复用监听多个事件源(如 UI 事件、Binder 调用),确保及时响应。

五、总结

  • 线程安全
    MessageQueue 通过 synchronized 锁保证多线程插入消息的安全性。

  • 高效唤醒
    结合 eventfd 和 epoll,在消息到达时精准唤醒目标线程,避免资源浪费。

  • 无缝跨线程通信
    Handler 机制隐藏了底层复杂性,开发者只需通过 post() 或 sendMessage() 即可实现线程间通信。

  • +-------------------------------------------+
    |           Android Handler 机制            |
    |        基于 MessageQueue 和 Native 唤醒       |
    +-------------------------------------------+
    | [主线程] [UI操作] <--> |Handler|           |
    |                         | sendMessage()   |
    |                         ↓                 |
    |                  +--------------+         |
    |                  | MessageQueue |         |
    |                  | (同步锁保护)   |         |
    |                  +--------------+         |
    |                         | nativeWake()    |
    |                         ↓                 |
    |               [eventfd] → [epoll_wait]    |
    |                         ↑                 |
    |                  +--------------+         |
    |                  | 工作线程 Looper|        |
    |                  | (处理耗时任务) |        |
    +-------------------------------------------+

相关推荐

Android Handle 机制常见问题深度解析-CSDN博客文章浏览阅读63次。本文聚焦Android开发中Handler机制的核心原理,系统解析线程与Handler/Looper/MessageQueue的关联、内存泄漏根源与解决方案、主线程与子线程的Handler使用差异、跨线程通信安全实现等关键知识点。通过代码示例与场景分析,阐明Handler的线程安全性、MessageQueue阻塞机制及HandlerThread适用场景,强调WeakReference防泄漏、Message复用优化等实践技巧。文章结构清晰,覆盖从基础概念到高级应用的完整知识链,助力开发者高效掌握 https://shuaici.blog.csdn.net/article/details/146340777Android 彻底掌握 Handler 看这里就够了-CSDN博客文章浏览阅读1.7k次,点赞16次,收藏19次。Handler 有两个主要用途:1、安排消息和可运行对象在将来的某个时间执行;2、将要在与您自己的线程不同的线程上执行的操作排入队列。_extends handler https://shuaici.blog.csdn.net/article/details/120238927

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

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

相关文章

MySQL中的锁机制:从全局锁到行级锁

目录 1. 锁的基本概念 2. 全局锁 2.1 全局锁的定义 2.2 全局锁的类型 2.3 全局锁的使用场景 2.4 全局锁的实现方式 2.5 全局锁的优缺点 2.6 全局锁的优化 3. 表级锁 3.1 表级锁的类型 3.2 表级锁的使用场景 3.3 表级锁的优缺点 4. 意向锁&#xff08;Intention Lo…

基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现

EasyRTC的核心架构围绕WebRTC技术构建&#xff0c;同时通过扩展信令服务、媒体服务器和NAT穿透机制&#xff0c;解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块&#xff1a; 1&#xff09;WebRTC基础层 媒体捕获与处理&#xff1a;通过getUserMediaAPI获取…

微服务架构中的API网关:Spring Cloud与Kong/Traefik等方案对比

微服务架构中的API网关&#xff1a;Spring Cloud与Kong/Traefik等方案对比 一、API 网关的概念二、API 网关的主要功能2.1 统一入口与路由转发2.2 安全与权限控制2.3 流量管理与容错2.4 API 管理与聚合2.5 监控与日志2.5 协议转换与适配2.6 控制平面与配置管理 三、API 网关选型…

NewStar CTF web wp

文章目录 week1headach3会赢吗智械危机谢谢皮蛋PangBai 过家家&#xff08;1&#xff09; week3include meblindsql1臭皮的计算机臭皮踩踩背这照片是你吗 week4Pangbai过家家四blindsql2chocolateezcmsssezpollute隐藏的密码 weeek5pangbai过家家(5)redissqlshell臭皮吹泡泡臭皮…

Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知

Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知 一&#xff0c;中断1.中断的流程2.上半部和下半部2.1上半部2.2下半部2.2.1 tasklet2.2.2 工作队列 3.按键延时消抖中断程序 二&#xff0c;阻塞和非阻塞IO和异步通知1.阻塞IO1.1 常见结构11.2 常见结构2 2.非阻塞IO2.1 驱动结构…

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…

探秘Transformer系列之(16)--- 资源占用

探秘Transformer系列之&#xff08;16&#xff09;— 资源占用 文章目录 探秘Transformer系列之&#xff08;16&#xff09;--- 资源占用0x00 概述0x01 背景知识1.1 数据类型1.2 进制&换算数字进制存储度量换算 1.3 参数显存占用有参数的层无参数的层所需资源 1.4 计算量 0…

jaeger安装和简单使用

文章目录 jaeger安装和使用什么是jaegerjaeger安装 jaeger安装和使用 什么是jaeger 官网&#xff1a;https://www.jaegertracing.io/ Jaeger 是一个分布式追踪系统。Jaeger的灵感来自 Dapper 和 OpenZipkin&#xff0c;是一个由 Uber 创建并捐赠给 云原生计算基金会&#xf…

【Mybatis-plus】在mybatis-plus中 if test标签如何判断 list不为空

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【递归,搜索与回溯算法篇】- 名词解释

一. 递归 1. 什么是递归&#xff1f; 定义&#xff1a; 函数自己调用自己的情况关键点&#xff1a; ➀终止条件&#xff1a; 必须明确递归出口&#xff0c;避免无限递归 ➁子问题拆分&#xff1a; 问题需能分解成结构相同的更小的子问题缺点&#xff1a; ➀栈溢出风险&#x…

大屏技术汇集【目录】

Cesium 自从首次发布以来&#xff0c;经历了多个版本的迭代和更新&#xff0c;每个版本都带来了性能改进、新功能添加以及对现有功能的优化。以下是 Cesium 一些重要版本及其主要特点&#xff1a; 主要版本概述 Cesium 1.0 (2012年) 初始版本发布&#xff0c;确立了Cesium作为…

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…

C++相关基础概念之入门讲解(下)

1. 引用 ​ int main() {const int a10;int& aaa;aa;cout<<aa<<endl; } 引用 不是新定义一个变量&#xff0c;而 是给已存在变量取了一个别名 &#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量 共用同一块内存空间&#xff08;初…

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…

Windows搭建免翻墙的BatteryHistorian

文章参考 GitCode - 全球开发者的开源社区,开源代码托管平台 免翻墙的BatteryHistorian主要原理&#xff1a;修改go源码 1.安装Java环境 1.点击下载 Java JDK&#xff0c;并安装,一路next 2.java -version 检验是否安装成功 2.安装Git工具 1、点击下载 Git&#xff0c;并…

WRF/Chem 模式技术解读:为大气污染治理提供有力支撑

技术点目录 第一部分、WRF-Chem模式应用案例和理论基础第二部分、Linux环境配置及WRF-CHEM第三部分、WRF-Chem模式编译&#xff0c;排放源制作第四部分、WRF-Chem数据准备&#xff08;气象、排放、初边界条件等&#xff09;&#xff0c;案例实践第五部分、模拟结果提取、数据可…

ccfcsp2701如此编码

//如此编码 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int a[21],b[21],c[21];for(int i1;i<n;i){cin>>a[i];}c[0]1;for(int i1;i<n;i){c[i]c[i-1]*a[i];}b[1](m%c[1])/c[0];int s1,s20;for(int i2;i<n;i){s2s2…

74HC04(反相器)和74HC14(反相器、施密特触发器)的区别

74HC04和74HC14的具体区别详解 同样具有反相器功能&#xff0c;你知道74HC04和74HC14的具体区别吗&#xff1f; 74HC04 对于74HC04很好理解&#xff0c;输入低电平&#xff0c;输出高电平&#xff1b;输入高电平&#xff0c;输出低电平。 建议操作条件&#xff1a; 下图是TI的…

第十四次CCF-CSP认证(含C++源码)

第十四次CCF-CSP认证 卖菜满分思路 买菜满分思路 再卖菜满分题解&#xff08;差分约束&#xff09;solution 1(枚举 correct but 超时)solution 2(正解) 卖菜 题目链接 满分思路 就是模拟一下这个调整第二天菜价的过程&#xff0c;其中对于两种只有一个邻居的情况下做出调整&…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…