文档章节

利用Android的消息机制实现线程同步

胖老狼
 胖老狼
发布于 2015/06/27 12:39
字数 833
阅读 57
收藏 0

      个人认为线程,多线程同步问题可以简单概括成如下一个问题:“共有资源,如何才能在2个以上的线程中安全读写?”本文通过逐步回答以下的两问题,来最终解决上面这个最根本的问题:

1 为什么是消息机制?

2 凭什么说是线程安全的?

下面,将会以主线程(即UI线程)与普通子线程的同步为例进行说明。


一 为什么是消息机制

        因为消息机制,有实现线程间通信的能力。并且我们可以肯定,handleMessage()函数会在Handler的实例化线程中调用,即在最下面例子中的主线程中调用。关于消息机制实现线程间通信的技术,可以参考以下文章:

Android中进程与线程及如何在子线程中操作UI线程

http://my.oschina.net/u/1182603/blog/164201

Android:子线程向UI主线程发送消息

http://www.bubuko.com/infodetail-675165.html

或者你会问"你是怎么肯定handleMessage()函数是在Handler的实例化线程中调用的呢?"。这个拿第二篇参考文章《Android:子线程向UI主线程发送消息》为例,Handler在主线程中实例化,而且handleMessage()函数中有UI操作。要知道不在主线程(即UI线程)的代码是不可以操作UI的。由此可见handleMessage()函数也是运行在主线程中,换言之是与Handler实例化的同一个线程。

二 凭什么说是线程安全

      因为同一线程内,不存在线程同步这一需求。我会知道在消息机制的操作中,sendMessage()发生在前,handleMessage()发生在后。而在多线程的应用中,sendMessage()通常是在子线程中调用,handleMessage()是在主线程调用。这里要使用一种,共有资源碎片化的技巧,来最终实现同步。这里举一下载大图片的例子,来加以说明:一个大JPG图片大小有6M,分3个子线程下载,每个线程下2M。那么操作骤如下:

2.1 每个子线程各分配2M缓存,并启动对应的下载。

2.2 子线程填满该2M缓存后,就结束本子线程中对该2M缓存的所有读写操作,并调用sendMessage()把这2M缓存发到主线程。

2.3 主线程中,通过handleMessage()收到3份缓存后才开始对这些缓存进行操作,即把这些“碎片”合成为一个完整的图片。

从上面这个大图片下载的例子可以看出,sendMessage()前各子线程对互不相干的“碎片”进行读写操作而主线程没有对这些“碎片”进行读写,sendMessage()后子线程不再读写些“碎片”而在之后的handleMessage()中主程线才开始读写“碎片”,所以对于单个碎片来说,同一时间段内都只是有一个线程在对其进行读写操作,所以说是线程安全的。






© 著作权归作者所有

胖老狼
粉丝 3
博文 38
码字总数 39666
作品 0
广州
高级程序员
私信 提问
深入理解Android消息处理系统——Looper、Handler、Thread

熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循...

惊天
2011/07/26
726
0
详解 Handler 消息处理机制(附自整理超全 Q&A)

Android 为什么要用消息处理机制 如果有多个线程更新 UI,并且没有加锁处理,会导致界面更新的错乱,而如果每个更新操作都进行加锁处理,那么必然会造成性能的下降。所以在 Android 开发中,...

银色子弹
06/04
0
0
浅析Android中的消息机制

在分析Android消息机制之前,我们先来看一段代码: 这段代码似乎看上去很正常,但是当你运行时就会发现,它会报一个致命性的异常: 到底是怎么回事呢?原因在于,Android系统中的视图组件并不...

hanzhankang
2014/01/25
25
0
Android之Handler用法总结

方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 Thread( Runnable() { r...

霞女
2014/04/16
27
0
Thread和Looper以及Handler和Message详解 Android开发必读

很多初入Android或Java开发的新手对Thread、Looper、Handler和Message仍然比较迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这...

元来元去
2011/11/28
183
0

没有更多内容

加载失败,请刷新页面

加载更多

黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
3
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
3
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
4
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
7
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部