android進程與線程詳解三:線程安全和進程間通信

線程安全
    在某些情況下,你實現的方法可能會在不同的線程中調用,所以它們必須被實現成“線程安全的”。
 
 
    這首先體現在可以遠程調用的方法上—比如在boundservice中的方法。當在一個進程中調用同一個進程中的IBinder上所實現的方法時,這個方法會在調用者的線程中運行(IBinder不理解的看這裡:/kf/201202/118415.html)。然而,當這個調用從另一個進程中發出時,方法會在線程池中某個被選出的線程中執行,這個線程在與IBinder相同的進程中(它不是運行於進程的界面線程中)。例如,盡管一個service的onBind() 方法在service所在進程的界面線程中調用,onBian()所返回的對象的方法(例如,一個子類所實現的那些RPC方法們)將在線程池的線程中調用。因為一個service可以擁有多個客戶端,某個時刻可能一個或多個池中線程被用於執行一個Ibinder的同一個方法。IBinder的方法們因此必須被實現為線程安全的。
 
 
 
    同樣的,一個內容提供者也可能收到來自不同線程的數據請求。盡管ContentResolver 和ContentProvider類隱藏瞭進程間通信的管理細節,ContentProvider的那些響應請求的方法們—query(),insert(), delete(), update(), 和getType()—會被內容提供者所在的進程中的線程池中的線程調用,而不是被進程的界面線程調用。因為這些方法們可能在同一時刻被任意數量的線程調用,所以它們必須被實現為線程安全的。
 
 
進程間通信
    Android通過遠程調用(RPCs)提供瞭進程間通信(IPC)機制,於是一個方法可以被另一個應用的Activity調用,但是它卻遠程執行(在另一個進程中),而又把結果返回給調用者。這使得必須分解一個方法調用和它的數據到操作系統能理解的水平,把它們從本地進程和地址空間傳到遠程進程和地址空間,然後重組並重演調用過程。要返回的結果以相反的方向傳送。Android提供瞭所有的執行這些IPC傳輸的代碼,於是你可以專註於定義和實現RPC 程序接口。
 
 
    要執行IPC,你的應用必須綁定到一個service,使用方法bindService()。
摘自 nkmnkm的專欄

發佈留言