文章目录

  • 一、Handler机制架构图
  • 二、Handler同步屏障机制
    • 2.1 MessageQueue.next()
  • 三、I/O多路复用
    • 3.1 相关函数
      • 3.1.1 epoll_create
      • 3.1.2 epoll_ctl
      • 3.1.3 epoll_wait

一、Handler机制架构图

二、Handler同步屏障机制

流程图在关键处对同步机制进行了说明, 接下来只取部分关键代码进行说明

2.1 MessageQueue.next()

Message next() {int pendingIdleHandlerCount = -1; // -1 only during first iterationint nextPollTimeoutMillis = 0;for (;;) {if (nextPollTimeoutMillis != 0) {Binder.flushPendingCommands();}nativePollOnce(ptr, nextPollTimeoutMillis);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) {// 遍历链表取出异步消息do {prevMsg = msg;msg = msg.next;} while (msg != null && !msg.isAsynchronous());// 注意!!! 这里并没有移除屏障的逻辑!!!// MessageQueue.removeSyncBarrier可以移除指定的同步屏障}//...

三、I/O多路复用

  • 1、IO多路复用的优势在于, 当处理的消耗对比IO几乎可以忽略不计时, 可以处理大量的并发IO, 而不用消耗太多的CPU/内存
  • 2、IO多路复用指的是同一个进(线)成可以处理多个IO数据流
  • 3、多线程+池模型指的是每个线程处理一个IO流

3.1 相关函数

3.1.1 epoll_create

// size: 告诉内核这个监听的数目一共有多大
int epoll_create(int size);
创建一个epoll句柄, 当创建好epoll句柄后, 它就是会占用一个fd值, 在使用完epoll之后, 必须调用
close()关闭, 否则就可能导致fd被耗尽

3.1.2 epoll_ctl

/*** fd: 需要监听的fd* *event: 告诉内核需要监听什么事件*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

3.1.3 epoll_wait

/*** 等待事件的产生* timeout: 超时时间(毫秒) 0立即返回, -1将阻塞, 大于0阻塞timeout后唤醒*/
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

Handler源码阅读相关推荐

  1. mybatis源码阅读

    说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...

  2. 【Dubbo源码阅读系列】之远程服务调用(上)

    今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...

  3. gin context和官方context_gin 源码阅读(二) 路由和路由组

    " 上一篇讲的是gin 框架的启动原理,今天来讲一下 gin 路由的实现. 1 用法 还是老样子,先从使用方式开始: func main() { r := gin.Default() r.G ...

  4. koa源码阅读之koa-compose/application.js

    koa源码阅读之koa-compose/application.js koa-Compose 为了理解方便特地把注释也粘进来 //这英语.我也来翻译一波 //大概就是把所有的中间件组合返回一个完整大块 ...

  5. android tcp socket框架_最流行的 Web 框架 Gin 源码阅读

    最近公司大部分项目开始往golang换, api的框架选定使用gin, 于是将 gin的源码看了一遍, 会用几篇文章将gin的流程及流程做一个梳理, 下面进入正题. gin框架预览 上图大概是 gin ...

  6. DM 源码阅读系列文章(二)整体架构介绍

    2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...

  7. 12.源码阅读(app启动流程-android api 26)

    activity的启动流程之前已经通过源码了解了,那么app的启动流程是怎样的,从我们按下app的图标,到应用启动起来显示出画面,中间都经历了什么? 安卓是基于java的,所以和java有一定的相似性 ...

  8. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  9. DotText源码阅读(7) --Pingback/TrackBack

    DotText源码阅读(7) --Pingback/TrackBack 博客这种服务的区别于论坛和所谓文集网站,很大程度上我认为是由于pingback/trackback的存在,使得博客这种自媒体有可 ...

  10. mybatis源码阅读(五) ---执行器Executor

    转载自  mybatis源码阅读(五) ---执行器Executor 1. Executor接口设计与类结构图 public interface Executor {ResultHandler NO_ ...

最新文章

  1. CentOS7下启动Nginx出现Failed to start nginx.service:unit not found
  2. 利用Unity3D制作简易2D计算器
  3. TestStack.White安装详解
  4. 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
  5. 16 代码分割之错误边界与Suspense和命名导出
  6. LeetCode MySQL 608. 树节点
  7. 辣味就直往眼睛的专业o2o资讯
  8. 程序员是吃青春饭的,为啥还有这么多人想转行当程序员?
  9. python绘制矩形图_Python。在底图中绘制矩形
  10. 构建可扩展的思科互联网络---单区域OSPF
  11. PS 插件批量压缩png图片
  12. 数据库课程设计-KTV点歌系统(VB.net 窗体,MySQL5.5)
  13. Wifi攻击工具 3:图形化工具 fern-wifi-cracker
  14. 编程环境搭建(云上编程和本地编程)
  15. 压敏电阻MOV特性及选用
  16. 5k显示器和4k显示器有什么区别
  17. C语言 - 隐式类型转换
  18. CSS3 SVG实现可爱的动物哈士奇和狐狸动画
  19. 几大科技公司的组织结构图
  20. 黑色炫酷动态引导页404页面源码 自适应

热门文章

  1. 税务会计实务【17】
  2. 简单python代码讲解-【第一期】用pycharm来编写简单代码(python教程)
  3. 利用python requests库在百度图库上下载图片
  4. 某品牌电批单机知识总结
  5. 技术分析:细说3D投影机技术原理
  6. Python——绘制词云图
  7. 一步到位:手把手教你R语言竞争风险模型建模-列线图-校准曲线-K折验证-外部验证- 决策曲线
  8. java模板引擎 jade_jade模板引擎
  9. SnakeYaml快速入门
  10. 2021年dedecms伪原创插件,织梦AI文章伪原创插件使用方法