android程式與執行緒詳解四:執行緒安全和程式間通訊

yangxi_001發表於2013-11-19

執行緒安全

    在某些情況下,你實現的方法可能會在不同的執行緒中呼叫,所以它們必須被實現成“執行緒安全的”。


    這首先體現在可以遠端呼叫的方法上—比如在boundservice中的方法。當在一個程式中呼叫同一個程式中的IBinder上所實現的方法時,這個方法會在呼叫者的執行緒中執行(IBinder不理解的看這裡:http://blog.csdn.net/nkmnkm/article/details/6453218)。然而,當這個呼叫從另一個程式中發出時,方法會線上程池中某個被選出的執行緒中執行,這個執行緒在與IBinder相同的程式中(它不是執行於程式的介面執行緒中)。例如,儘管一個serviceonBind()方法在service所在程式的介面執行緒中呼叫,onBian()所返回的物件的方法(例如,一個子類所實現的那些RPC方法們)將線上程池的執行緒中呼叫。因為一個service可以擁有多個客戶端,某個時刻可能一個或多個池中執行緒被用於執行一個Ibinder的同一個方法。IBinder的方法們因此必須被實現為執行緒安全的。


    同樣的,一個內容提供者也可能收到來自不同執行緒的資料請求。儘管ContentResolverContentProvider類隱藏了程式間通訊的管理細節,ContentProvider的那些響應請求的方法們—query(),insert(), delete(), update(), getType()—會被內容提供者所在的程式中的執行緒池中的執行緒呼叫,而不是被程式的介面執行緒呼叫。因為這些方法們可能在同一時刻被任意數量的執行緒呼叫,所以它們必須被實現為執行緒安全的。


程式間通訊

    Android通過遠端呼叫(RPCs)提供了程式間通訊(IPC)機制,於是一個方法可以被另一個應用的Activity呼叫,但是它卻是遠端執行的(在另一個程式中),而又把結果返回給呼叫者。這使得必須分解一個方法呼叫和它的資料到作業系統能理解的水平,把它們從本地程式和地址空間傳到遠端程式和地址空間,然後重組並重演呼叫過程。要返回的結果以相反的方向傳送。Android提供了所有的執行這些IPC傳輸的程式碼,於是你可以專注於定義和實現RPC程式介面。

 

    要執行IPC,你的應用必須繫結到一個service,使用方法bindService()

相關文章