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

学习电子商务网站建设与管理的收获6长沙百度关键词推广

学习电子商务网站建设与管理的收获6,长沙百度关键词推广,南京市建设工程档案馆网站,营销比较成功的企业一. 前言 接上一篇文章为什么设计Handler , 我们来继续讲解一下Handler的实现原理, 俗话说一个好汉三个帮, 接下来一步一步引入各个主角,并说明它们在Handler机制中扮演的角色和作用. 二. Handler实现原理 首先我们先确定一个结论: 使用 Handler 是希望它被实例化在哪个线程&a…

一. 前言

        接上一篇文章为什么设计Handler , 我们来继续讲解一下Handler的实现原理, 俗话说一个好汉三个帮, 接下来一步一步引入各个主角,并说明它们在Handler机制中扮演的角色和作用.

二. Handler实现原理

        首先我们先确定一个结论:  使用 Handler 是希望它被实例化在哪个线程,哪个线程就是消息的接收端,在其他线程内发送消息时,调用的还是这个 Handler对象的 sendMessage(xx).

结论支撑可以看之前的博客:  HandlerThread源码理解

图一:

图二: 

 

我们再来看一张关于多线程之间的通信图

 这个图也可以得出如下结论:Handler 接收消息端是线程独立的,不管 handler的引用在哪个线程发送消息都会传回自己被实例化的那个线程中.

但显而易见的是 Handler 不可能是线程独立的,因为它的引用会在别的线程作为 消息的发送端,也就是说它本身就是多线程共享的引用,不可能独立存在于某个线程内.

所以!Handler 需要一个独立存在于线程内部且私有使用的类帮助它接收消息! 这个类就是 Looper!

三. Looper -线程独立

        通过上节我们已经知道设计Looper就是为了辅助Handler接收消息且仅独立于线程内部。那如何才能实现线程独立的呢?

        Java 早就考虑到了这一点,早在 JDK 1.2 的版本中就提供 ThreadLocal 这么一个工具类来帮助开发者实现线程独立。

        那为什么要理解ThreadLocal呢? 因为Looper源码中有这一段代码

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}sThreadLocal.set(new Looper(quitAllowed));}

这样子就实现了Looper线程独立. 

理解ThreadLocal 原理需要先掌握一下 java强软弱虚引用基本概念, 参考笔者之前写的博客:

java 强软弱虚引用和ThreadLocal工作原理

到这里就可以支撑这个结论:有了ThreadLocal 之后我们只需要把 Looper 存进去就能实现线程独立了.

到这里再梳理一下流程:

 1. Handler 引用可以多线程间共享。

2. 当 Handler 对象在其他线程发送消息时,通过 Handler 的引用找到它所在线程的 Looper 接收消息。

3. Looper 负责接收消息再分发给 Handler 的接收消息方法

这里我们再提一个问题: 如果多个线程同时使用一个 Handler 发消息,Looper 该怎么办?给接收消息的方法上锁吗?

回答: 显然不能这样做

解决方法呢? 

google工程师就设计出MessageQueue来解决这个问题.

 

四. MessageQueue - 多线程同时发消息

        为了防止多个线程同时发送消息 Looper 一下着忙不过来,于是设计一个 MessageQueue 类以队列的方式保存着待发送的消息,这样 Looper 就可以一个个 的有序的从 MessageQueue 中取出消息处理了。 既然 MessageQueue 是为 Looper 服务的,而 Looper 又是线程独立的,所以 MessageQueue 也是线程独立的. 

        MessageQueue 看名字应该是个队列结构,队列的特点是什么?先进先出,一般在队尾增加数据,在队首进行取数据或者删除数据。那Handler中的消息似乎也满足这样的特点,先发的消息肯定就会先被处理。但是,Handler中还有比较特殊的情况,比如延时消息。
延时消息的存在就让这个队列有些特殊性了,并不能完全保证先进先出,而是需要根据时间来判断,所以Android中采用了链表的形式来实现这个队列,也方便了数据的插入.

数据结构中队列和链表的基本概念理解,请参考笔者博客:

五. 总结

现在我们已经知道为了完成异步消息功能需要有 Handler 家族的四位成员共同合作:

Handler: 负责发送消息,为开发者提供发送消息与接收消息的方法。

Message: 消息载体,负责保存消息具体的数据。

MessageQueue:消息队列,以队列形式保存着所有待处理的消息,  原理实现采用的是链表.

Looper:消息接受端,负责不断从 MessageQueue 中取出消息分发给 Handler 接受消息端

这四位成员哪个都不是平白无故出现的。因为要规范化消息传递格式而定义了 Message;

为了实现消息接收端只存在线程内部私有化使用而定义了 Looper;

为 了解决多线程同时发送数据 Looper 分发消息处理时会产生的问题而设计 MessageQueue 队列化消息。

到这里你应该知道了 Handler 家族四位成员各自负责的是什么工作,以及他们自身的特点特殊性,比如 Handler 是线程间共享的而 Looper 是线程独立的, MessageQueue 跟 Looper 又是一对一的。

工作图:

 

http://www.hkea.cn/news/913036/

相关文章:

  • 网页制作教程课件seo推广排名重要吗
  • 小规模纳税人企业所得税怎么征收广州seo招聘
  • 济南企业自助建站网络营销策划公司
  • iis 新建网站 要登录温州seo推广外包
  • 个人想做企业网站备案惠州seo代理商
  • 做公务员题的网站口红的推广软文
  • 福州网站建设 联系yanktcn 04上海百网优seo优化公司
  • 网站备案号如何获得网站建设营销推广
  • 物流网站开发公司西安 做网站
  • 商务信息网站怎么做网络视频营销策略有哪些
  • 社交做的最好的网站怎么开发一个网站
  • 教育品牌网站建设百度搜索推广和信息流推广
  • 虎门专业做网站对网络营销的认识有哪些
  • 投资理财培训网站建设抖音引流推广一个30元
  • 做景观设施的网站网络营销推广要求
  • 携程网站建设进度及实施过程网络营销的缺点及建议
  • 石家庄网站建设哪家专业中国联通腾讯
  • 能访问各种网站的浏览器百度一下网页搜索
  • 自己做网站花多少钱雅虎搜索
  • 哈尔滨招标信息网网站推广优化排名教程
  • 个人可以建论坛网站吗福清网络营销
  • 济南做网站优化价格百度推广网站一年多少钱
  • 做网上商城网站哪家好杭州seo靠谱
  • 做营销网站制作关键词优化课程
  • 网站移动终端建设口碑营销成功案例
  • 美国做试管婴儿 网站推广普通话宣传语
  • 网站备案信息查询系统软文发布平台媒体
  • 泊头哪给做网站的好制作网页的教程
  • 漳州建设银行网站首页在百度上打广告找谁
  • 网站免费建站k网络营销策划方案书