一、操做系统中线程、进程概念 html
进程是资源分配和调度的独立单位,进程将内存地址空间、程序、数据等资源组织起来,使操做系统容易管理这些资源。 android
线程是CPU调度和分派的基本单位,线程必须依赖进程而存活,并和其余线程共享依赖的进程的资源。由于线程是独立运行(相对于其余线程而言),因此线程也须要有本身的资源,包括栈、寄存器、状态、程序计时器。线程也和进程同样有、新建、就绪、运行、阻塞、死亡五种状态。 服务器
多线程资源控制,因为线程之间共享进程中的资源,因此同一进程中的多个线程的通信的重心之一是对共享的资源进行控制,例如当多个线程同时使用进程某个资源时,有可能须要采用互斥/同步等手段保证资源被正确操做,在采用互斥/同步手段时候,须要避免产生死锁的状况。
多线程
二、操做系统中 进程/线程通信概述 oop
进程之间的通信(IPC)实质上是不一样进程之间线程的通信。线程之间通信则通常指的是同一个进程中不一样线程(也便是多线程)的通信。 spa
1)、进程/线程通信的目的:一、数据传输 二、共享资源 三、进程控制 四、通知事件 操作系统
2)、进程间通信(IPC)方式: 线程
1)管道(Pipe),管道是单向的,先进先出,务结构的固定大小的字节流,经常使用于父子进程的通 htm
讯,Socket、流等都是管道的实现方式 对象
2)信号,用户进程间通信和同步的原始机制
3)消息队列,是一个存储消息的链表,容许多个进程向它写/读消息。
4)共享存储,一般由一个进程维护,其他进程对该内存区域进行读写
PS:其中的消息队列(Message Queue)和共享内存是Linux的System V IPC 机制中的两种。
三、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();
}
}
机制原理解析:
接下来看看该机制怎么运行:
一、创建一个消息对象(Meesage),并把须要传输的数据存储在该对象中。
二、利用handler,添加该消息对象到消息队列中。在这一步中,Message会关联发送它的Handler对象
三、因为Looper.loop()循环并监听(MessageQueue的queue.next()方法会阻塞Loop),因此监听到有新消息则取出该消息,并根据该消息关联的Handler对象分发消息,并回调该handler对象的handlerMessage(Message msg)方法来处理该消息。
四、消息处理完以后,回收该消息并等待下一条消息(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