利用Android的消息机制实现线程同步
利用Android的消息机制实现线程同步
胖老狼 发表于2年前
利用Android的消息机制实现线程同步
  • 发表于 2年前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 这里介绍一个不直接使用原始线程同步代码,也能实现线程同步的方法。换句话说就是不直接使用“synchronized”等的关键字,实现线程同步的方法。

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






共有 人打赏支持
粉丝 4
博文 14
码字总数 39666
×
胖老狼
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: