进程/线程概念和Android异步通讯机制
2013-11-17 16:11
295 查看
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:/detail/2547093380.html
百度百科《进程间的通信》
URL:http://baike.baidu.com/view/1492468.htm
《进程和线程的区别》
URL:/detail/2493130580.html
进程是资源分配和调度的独立单位,进程将内存地址空间、程序、数据等资源组织起来,使操作系统容易管理这些资源。
线程是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:/detail/2547093380.html
百度百科《进程间的通信》
URL:http://baike.baidu.com/view/1492468.htm
《进程和线程的区别》
URL:/detail/2493130580.html
相关文章推荐
- Android--线程与异步消息处理机制
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android:在子线程中更新UI,解析异步消息处理机制(Handler)
- Android基础系列-----------Android进程/线程管理应用示例(Android中的消息队列和线程队列机制)
- linux进程间通讯,Android系统各种进程间通信机制
- 2011年Android IPC进程间通讯机制学习笔记之一
- android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)
- Android IPC进程间通讯机制
- Android IPC机制之IPC概念、Android 多进程和相关基础知识
- Android基本概念: 应用, 任务, 进程, 和线程
- Android 异步任务,通过PHP访问数据库,多线程,线程间通讯
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android IPC进程间通讯机制学习笔记
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android系统中异步消息处理线程机制的理解
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】
- Android IPC进程间通讯机制学习笔记
- Android应用中通过AIDL机制实现进程间的通讯实例
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
- Android IPC进程间通讯机制学习笔记