安卓php推送消息机制,利用Android的消息机制实现线程同步

本文探讨了Android中线程同步的问题,重点在于如何使用消息机制保证共有资源的安全读写。通过分析为何选择消息机制以及其线程安全的原因,举例说明了在主线程和子线程间如何利用Handler进行安全通信。关键在于通过消息传递,确保在正确线程中执行对应操作,避免了多线程间的冲突,实现了线程安全的资源管理。
摘要由CSDN通过智能技术生成

个人认为线程,多线程同步问题可以简单概括成如下一个问题:“共有资源,如何才能在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()中主程线才开始读写“碎片”,所以对于单个碎片来说,同一时间段内都只是有一个线程在对其进行读写操作,所以说是线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值