文档章节

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

胖老狼
 胖老狼
发布于 2015/06/27 12:39
字数 833
阅读 50
收藏 0
点赞 0
评论 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
博文 14
码字总数 39666
作品 0
广州
高级程序员
Android系统的编舞者Choreographer

个人博客地址 http://dandanlove.com/ 前言 上一篇文章 Android的16ms和垂直同步以及三重缓存 解释了手机流畅性的问题,并在文章中提到了在Android4.1中添加的。机制,用于同机制配合,实现统...

静默加载 ⋅ 04/25 ⋅ 0

深入理解Android消息处理系统——Looper、Handler、Thread

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

惊天 ⋅ 2011/07/26 ⋅ 0

说说在 Android 中如何实现多线程编程

当我们执行一些耗时操作,比如发起一条网络请求时,考虑到网速等其他因素,服务器未必会立刻响应我们的请求,那么就必须将这类操作放在子线程中运行,这就需要实现多线程编程。 1 启动线程 ...

deniro ⋅ 06/18 ⋅ 0

Android AIDL浅析及异步调用

AIDL:Android Interface Definition Language,即 Android 接口定义语言。 AIDL 是什么 Android 系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。 为了使其...

cspecialy ⋅ 05/20 ⋅ 0

Handler消息处理机制

Android在设计时引入了Handler消息机制,每一个消息发送到主线路的消息队列中,消息队列遵循先进先出原则,发送消息不会阻塞线程,而接收线程会阻塞线程。Handler允许发送并处理Message消息,...

LionSword ⋅ 2014/06/22 ⋅ 1

Android Handler异步通信:深入详解Handler机制源码

前言 在开发的多线程应用场景中,机制十分常用 今天,我将手把手带你深入分析 机制的源码,希望你们会喜欢 目录 1. Handler 机制简介 在多线程的应用场景中,将工作线程中需更新的操作信息 ...

carson_ho ⋅ 05/21 ⋅ 0

Handler消息处理机制分析

Handler经常用,然后自己总结一下下 一. What、Handler 是什么 Handler 与 Message、MessageQueue、Looper 一起构成了 Android 的消息机制,Android 系统通过大量的消息来与用户进行交互,V...

大二架构师 ⋅ 05/07 ⋅ 0

AIDL跨进程Service推送消息到Activity

AIDL的概念不说了,一般都是Activity调用service的方法去获取一些东西,但是如何做到service主动回调activity的方法去推送一些东西的,这种需求一般也是会有的(比如后台有个定位,每次位置更新或...

倔强码农 ⋅ 04/11 ⋅ 0

聊聊为什么在activity启动的时候获取不到View的宽高

周五一大早看到一篇鸿洋推了一篇博客讲onResume中Handler.post(Runnable)为什么获取不到宽高?,细细读了两遍,有些收获,但依然有些不明白的地方,同时对有些细节不太认同。于是自己梳理了一...

Marco黑八 ⋅ 06/03 ⋅ 0

AndroidThings之基础二 设计理念

转载自:https://blog.csdn.net/tangxiaoyin/article/details/75273491 (PS:目前AndroidThings已经走向消费级别,发布正式版本1.0版,开发板推荐树莓派3B+) 前言 2012 年 6 月,由 IoT-GSI(...

qq_28831197 ⋅ 05/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 50分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 今天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 今天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 今天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 今天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 今天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部