一、操做系統中線程、進程概念 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