文档章节

进程/线程概念和Android异步通讯机制

JouTzaShin
 JouTzaShin
发布于 2013/11/17 16:11
字数 1271
阅读 1673
收藏 19

1、操作系统中线程、进程概念

    进程资源分配和调度的独立单位,进程将内存地址空间、程序、数据等资源组织起来,使操作系统容易管理这些资源。


    线程CPU调度和分派的基本单位,线程必须依赖进程而存活,并和其他线程共享依赖的进程的资源。因为线程是独立运行(相对于其他线程而言),所以线程也需要有自己的资源,包括栈、寄存器、状态、程序计时器。线程也和进程一样有、新建、就绪、运行、阻塞、死亡五种状态。

    多线程资源控制,由于线程之间共享进程中的资源,所以同一进程中的多个线程的通讯的重心之一是对共享的资源进行控制,例如当多个线程同时使用进程某个资源时,有可能需要采用互斥/同步等手段保证资源被正确操作,在采用互斥/同步手段时候,需要避免产生死锁的情况。


2、操作系统中 进程/线程通讯概述

    进程之间的通讯(IPC)实质上是不同进程之间线程的通讯。线程之间通讯则一般指的是同一个进程中不同线程(也即是多线程)的通讯。


     1)、进程/线程通讯的目的:1、数据传输 2、共享资源 3、进程控制 4、通知事件

     2)、进程间通讯(IPC)方式:

                1)管道(Pipe),管道是单向的,先进先出,务结构的固定大小的字节流,常用于父子进程的通

                      讯,Socket、流等都是管道的实现方式

                2)信号,用户进程间通讯和同步的原始机制

                3)消息队列,是一个存储消息的链表,允许多个进程向它写/读消息。

                4)共享存储,通常由一个进程维护,其余进程对该内存区域进行读写

                PS:其中的消息队列(Message Queue)和共享内存是Linux的System V IPC 机制中的两种。


3、Android中特有的线程通讯方式的详细描述

    在Android程序中,如果你阻塞一个UI线程多达5秒之后,一般会造成ANR(Application Not Responding)情况的出现,导致程序出现无响应的提示。所以如果要做一些比较耗时的操作,例如与服务器进行数据交互,则需要重开一条线程进行处理。但是随着又引出了一个问题,就是在两条不同的线程之间怎么进行通讯(例如数据传输和通知),例如在一条线程中读取服务器的数据,然后怎么传递该数据给UI线程并通知它更新到界面上去?在android系统里面是利用Handler+MessageQueue+Looper机制来解决同一进程中两个线程间的通讯。实质上也就是,上面所说的操作系统进程间通讯的方式之一消息队列。

接下来从使用该机制和解析该机制是怎么工作的这两个方面来阐述Handler+MeesageQueue+Looper这一通讯机制。


使用该机制:

实质上就是对象的建立和关联)。[PS:以下代码未经过运行,只是为了阐述Handler+MessageQueue+Looper机制]

class ShowAndroidTC  extends Thread{

    public void run(){

        //建立Looper对象并关联到当前线程中,建立Looper的时候,Looper也创建了MessageQueue

          Looper.prepare();

       //建立Handler,在Handler构造器中关联了当前线程的Looper和Looper中的消息队列            

        Handler handler = new Handler(){};//这里省略了重写handleMessage方法

        //循环并开始监听消息队列

         Looper.loop();

    }

}

机制原理解析:

接下来看看该机制怎运行

1、建立一个消息对象(Meesage),并把需要传输的数据存储在该对象中。

2、利用handler,添加该消息对象到消息队列中。在这一步中,Message会关联发送它的Handler对象

3、由于Looper.loop()循环并监听(MessageQueue的queue.next()方法会阻塞Loop),所以监听到有新消息则取出该消息,并根据该消息关联的Handler对象分发消息,并回调该handler对象的handlerMessage(Message msg)方法来处理该消息。

4、消息处理完之后,回收该消息并等待下一条消息(queue.next())。

综上所述,其实传递数据介质利用的是Messge,通知事件利用的是消息分发

PS:括号里面的代码是根据Hanlder、MessageQueue、Message、Looper源代码分析而来。全部类在源代码 android.os包里。

最后,如有本文所述有纰漏或描述不当,甚至有错误,请一定指出,谢谢!

参考文章:

《操作系统中的进程与线程 》

URL:http://www.cnblogs.com/CareySon/archive/2012/05/04/ProcessAndThread.html

百度百科《进程间的通信》

URL:http://baike.baidu.com/view/1492468.htm

《进程和线程的区别》

URL:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html




© 著作权归作者所有

共有 人打赏支持
上一篇: XML简述和XML使用
下一篇: 电子商务简述
JouTzaShin
粉丝 0
博文 5
码字总数 2899
作品 0
中山
私信 提问
Android IPC进程间通讯机制

一.Linux系统进程间通信有哪些方式? 1.socket; 2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量; 5.share memory共享内存; 二.Java系统的通信方式是什么? 1.socket; ...

Simpleness
2012/06/28
0
0
Android 核心分析 之六 -----IPC框架分析 Binder,Service,Se...

我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念。从Linux的概念空间中,Android的设计Activity托管在不同的的进程,Service也都是托管在不同的进程,不同进程间的...

LiSteven
2013/08/23
0
0
分享一份非常强势的Android面试题

马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考链接: blog.csdn.net/shu_lance/a… ...

codeGoogle
08/23
0
0
android消息机制,异步和多线程

android消息机制,异步和多线程 前言 在xxxx1.92正式版的时候付费购买曾单独封装了一个流程PaymentFlow并继承于Handler,调用方只要依据这个流程创建流程实例并触发开始,实例即可依据设定的支付...

ZHL
2012/09/03
0
0
3.Android技术点@wq

1 多线程,线程池,进程,线程安全,队列。 syncynized this.wait this.notify lock.lock() lock.unlock() condition.await(); condition.soignal(); ConcurrentLinkedQueue 非阻塞cas机制 ......

desaco
10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 动态代理的实现

在Java中可以实现动态代理的方式有很多种:JDK方式、ASM字节码操控框架、开源的分析、编辑和创建Java字节码的类库Javassist、基于ASM框架实现的CGLIB JDK方式:通过Java反射的方式生成动态代...

我爱春天的毛毛雨
11分钟前
1
0
css 总结2

1、背景有关 (1)background-origin:border-box、padding-box、content-box //默认是padding-box(2)background-image: url(img_flwr.gif), url(paper.gif);(3)background-posi......

tianyawhl
12分钟前
1
0
java 每秒钟只允许十个线程同时并发

package com.qimh.thread.concurrent;import java.util.Date;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurren......

qimh
27分钟前
4
0
学习Hadoop大数据基础框架

什么是大数据?进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的...

本宫没空2
29分钟前
2
0
redis

1,安装 sudo apt-get install redis-server 2,登录本地的 redis-cli 3,修改 .bashrc文件,连接其他线下数据库 vi .bashrc在最后增加alias redisa="redis-cli -h 10.15.100.134 -p 666...

鹏灬
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部