Handler系列-消息屏障

1.调用postSyncBarrier插入target为null的Message

这种消息为屏障消息,返回token,通过token可以移除这个屏障消息

public final class MessageQueue {public int postSyncBarrier() {return postSyncBarrier(SystemClock.uptimeMillis());}private int postSyncBarrier(long when) {// Enqueue a new sync barrier token.// We don't need to wake the queue because the purpose of a barrier is to stall it.synchronized (this) {final int token = mNextBarrierToken++;//创建的Message target为nullfinal Message msg = Message.obtain();msg.markInUse(); //放入链表之前msg.when = when;msg.arg1 = token;Message prev = null;Message p = mMessages;//在链表里,替when找到合适的位置if (when != 0) {while (p != null && p.when <= when) {prev = p;p = p.next;}}//prev p(p要不然为null,要不然p的when大于when)if (prev != null) { // invariant: p == prev.next//prev msg p:msg放在prev和p之间msg.next = p;prev.next = msg;} else {//msg放到表头msg.next = p;mMessages = msg;}return token;}}
}

2.通过Message.next取出异步消息(isAsynchronous()为true)

在获得下一个要处理的Message的时候,如果MessageQueue有屏障消息,那就会pass掉!isAsynchronous()的消息,获得异步消息,对异步消息进行处理。

public final class MessageQueue {Message next() {for (;;) {synchronized (this) {// Try to retrieve the next message.  Return if found.final long now = SystemClock.uptimeMillis();Message prevMsg = null;Message msg = mMessages;//如果表头的target为null(屏障消息)if (msg != null && msg.target == null) {//如果表头消息的target为null// Stalled by a barrier.  Find the //next asynchronous message in the queue.//遍历,跳过!isAsynchronous()的消息do {prevMsg = msg;msg = msg.next;} while (msg != null && !msg.isAsynchronous());}//msg 为null或者msg的isAsynchronous为true时跳出循环//也就是说如果有屏障消息,那这里的msg要么为null,要么是异步消息//如果没有屏障消息,那这里的msg就是表头if (msg != null) {if (now < msg.when) {//当前时间小于msg的when// Next message is not ready.  Set a timeout //to wake up when it is ready.nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);} else {// Got a message.mBlocked = false;//prevMsg msg msg.nextif (prevMsg != null) {prevMsg.next = msg.next;} else {mMessages = msg.next; //更新表头}msg.next = null;msg.markInUse(); //next()返回消息之前调用markInUsereturn msg;}} else {//没有消息// No more messages.nextPollTimeoutMillis = -1;}}}}
}

3.removeSyncBarrier移除屏障消息

根据token找到对应的屏障消息,从链表移除,对这个Message进行回收

public final class MessageQueue {public void removeSyncBarrier(int token) {// Remove a sync barrier token from the queue.// If the queue is no longer stalled by a barrier then wake it.synchronized (this) {Message prev = null;Message p = mMessages;//找target为null且arg1为tokenwhile (p != null && (p.target != null || p.arg1 != token)) {prev = p;p = p.next;}if (p == null) {throw new IllegalStateException("The specified message queue " +  "synchronization barrier token has not been posted or " ++ "has already been removed.");}final boolean needWake;if (prev != null) {//prev有值prev.next = p.next;needWake = false;} else {mMessages = p.next;//没有消息或者链表头的target不为nullneedWake = mMessages == null || mMessages.target != null; }p.recycleUnchecked(); //回收p// If the loop is quitting then it is already awake.// We can assume mPtr != 0 when mQuitting is false.if (needWake && !mQuitting) {nativeWake(mPtr);}}}
}

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

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

相关文章

Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建 本次搭建使用influx proxy 介绍 github地址:https://github.com/chengshiwen/influx-proxy/ Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务&#xff0c;实现了 InfluxDB 高可用集群的部署方案&#xff0c; 具有动态扩/缩容、故障恢复…

Salesforce服务云和营销云重大创新!通过大数据和AI赋能为客户提供非凡体验

4月6日&#xff0c;Salesforce宣布推出新的Service Cloud和Marketing Cloud功能&#xff0c;通过AI驱动的数字化语音、移动离线访问相关信息、Intelligence和CDP创新&#xff0c;使客户体验更加人性化。借助Salesforce与人工智能相结合的强大创新&#xff0c;企业可以提供个性化…

初探HarmonyOS路由跳转

最近的鸿蒙新闻也是很大声势&#xff0c;鸿蒙的纯血版一出&#xff0c;各大互联网大厂都坐不住了&#xff0c;纷纷加入其中。这意味鸿蒙将来会取代大部分Android用户&#xff0c;这也是程序员的一篇大好前程。如今的Android开发行业已经夕阳西下了。 网上有关HarmonyOS的资料几…

分析:为什么有些pdf打开之后无法编辑?

pdf文件大家应该都经常接触&#xff0c;但是不知道大家会遇到这种情况&#xff1a;有些PDF文件打开之后无法编辑&#xff1f;是什么原因呢&#xff1f;今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认…

安全狗入选《2024中国企业服务云图(精选版)》多个细分领域

近日&#xff0c;由吴中区人民政府、苏州市工信局指导&#xff0c;崔牛会主办&#xff0c;苏州太湖国家旅游度假区管委会协办的2023中国SaaS大会在苏州顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗突出的多项安全能力也在大会上受到认可。 厦门服云信息科技有限…

前后端分离开发出现的跨域问题

先说说什么是跨域。 请求的URL地址中的协议、域名、端口号中的任意一个与当前URL不同就是跨域。 比如&#xff1a; 当前页面的URL请求的URL是否跨域原因htttp://localhost:8080htttps://localhost:8080是协议不同htttp://localhostll:8080htttp://localhost:8080是域名不同htt…

C++操纵数组

藤藤有一个长度为n的数组 a 现在藤藤希望改变这个数组&#xff0c;使得该数组的最小值尽可能的大。 现在藤藤可以施展m次魔法&#xff0c;每次魔法可以使得连续长度为 L 的一段每个元素 1。 藤藤想知道最终这个数组的最小值最大可以达到多少&#xff1f; 输入格式 第一行三…

C/C++ 常用的四种查找算法

在计算机科学中&#xff0c;搜索算法是一种用于在数据集合中查找特定元素的算法。C语言作为一种强大的编程语言&#xff0c;提供了多种搜索算法的实现方式。本文将介绍C语言中的四种常见搜索算法其中包括&#xff08;线性查找&#xff0c;二分法查找&#xff0c;树结构查找&…

【电路笔记】-电阻串联

电阻串联 文章目录 电阻串联1、概述2、电阻串联3、串联电阻电压4、电阻串联示例15、分压电路6、电阻串联示例27、电阻串联的应用8、总结 当电阻器以菊花链方式连接在一条线上时&#xff0c;电阻器被称为串联连接&#xff0c;从而导致共同电流流过它们。 1、概述 各个电阻器可以…

刷题感悟w

题目很长的一定要慢慢把题目的意思搞清楚 有重复操作不知道怎么办 可以用数组去标记 你好&#xff01;在C中&#xff0c;replace 函数通常是用于替换容器&#xff08;例如 std::vector 或 std::string&#xff09;中的特定元素的函数。以下是 std::replace 函数的一般用法&…

vue3中的Fragment、Teleport、Suspense新组件

Fragment组件 在Vue2中: 组件必须有一个根标签 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中 好处: 减少标签层级, 减小内存占用 <template><div style"font-size: 14px;"><p> 组件可以没有根标签</p&g…

ubuntu22.04新机使用(换源,下载软件,安装显卡驱动,锁屏长亮)

换源 国内有很多Ubuntu的镜像源&#xff0c;包括阿里的、网易的&#xff0c;还有很多教育网的源&#xff0c;比如&#xff1a;清华源、中科大源。推荐使用中科大源&#xff0c;快得很。 /etc/apt/sources.list编辑/etc/apt/sources.list文件, 在文件最前面添加以下条目(操作前…

【Vue】绝了!还有不懂生命周期的?

生命周期 Vue.js 组件生命周期&#xff1a; 生命周期函数&#xff08;钩子&#xff09;就是给我们提供了一些特定的时刻&#xff0c;让我们可以在这个周期段内加入自己的代码&#xff0c;做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中&#xff0c;…

Update this scope and remove the “systemPath“

问题 解析&#xff1a; 在特定的指定路径上查找系统相关性。这大大降低了可移植性&#xff0c;因为如果您将工件部署在一个与您的环境不同的环境中&#xff0c;代码将无法工作。 解决&#xff1a; 1 使用官方maven仓库的第三方jar包 2 如果官方仓库不存在jar包&#xff0c;…

模拟退火算法应用——求解TSP问题

仅作自己学习使用 一、问题 旅行商问题(TSP) 是要求从一个城市出发&#xff0c;依次访问研究区所有的城市&#xff0c;并且只访问一次不能走回头路&#xff0c;最后回到起点&#xff0c;求一个使得总的周游路径最短的城市访问顺序。 采用模拟退火算法求解TSP问题&#x…

接口测试【加密解密攻防完整版】实战教程详解

一、对称加密 对称加密算法是共享密钥加密算法&#xff0c;在加密解密过程中&#xff0c;使用的密钥只有一个。发送和接收双方事先都知道加密的密钥&#xff0c;均使用这个密钥对数据进行加密和解密。 数据加密&#xff1a;在对称加密算法中&#xff0c;数据发送方将明文 (原…

【JavaScript】3.3 JavaScript工具和库

文章目录 1. 包管理器2. 构建工具3. 测试框架4. JavaScript 库总结 在你的 JavaScript 开发之旅中&#xff0c;会遇到许多工具和库。这些工具和库可以帮助你更有效地编写和管理代码&#xff0c;提高工作效率。在本章节中&#xff0c;我们将探讨一些常见的 JavaScript 工具和库&…

linux安装minIo(亲测可用)

一、创建文件夹 进入opt文件夹 cd /opt/创建minio文件夹&#xff1b; mkdir minio赋予权限 chmod 777 minio/执行完后查看目录 进到minio文件夹 创建bin目录 mkdir bin创建data目录 mkdir data创建log touch minio.log创建start.sh文件&#xff0c;并写入数据(不会vi或…

微信公众号扫码授权登录源码 / PHP微信扫码关注公众号并授权登录源码

源码简介&#xff1a; 在当今的互联网时代&#xff0c;微信公众号已成为众多企业与用户之间进行交流和沟通的重要工具&#xff0c;其中包括用户的登录认证。通过关注公众号登录&#xff0c;不仅可以为公众号带来流量&#xff0c;还能够实现用户与公众号粉丝之间的一一对应关系…

数据治理模型的三个模块

数据接入模块 大数据工程的数据来源包含企业内部数据和企业外部数据&#xff0c;其中企业内部数据由资源服务平台、综合资源库、各业务系统生产库中的结构化数据和文件服务器上的文本、图片等非结构化数据组成&#xff0c;其中包括人财物记录、财物报表、原材料、顾客信息、气…