1. 程式人生 > 實用技巧 >Rxjava2 原始碼解析(六)---執行緒篇

Rxjava2 原始碼解析(六)---執行緒篇

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

前言

好久沒寫部落格了,主要是最近公司業務比較忙。今天閒下來,所以補了之前的一個坑。

最初學Rxjava的時候,關於執行緒,聽到了一種理解,深信不疑。具體是什麼這裡就不說了,怕誤導大家。直到逐漸瞭解了rxjava的原始碼,慢慢才揭開了rxjava 執行緒控制的真實面紗。

關於具體的subscribeOn 和 observeOn 方法的實現原理,在前面的文章中已經進行了詳細的介紹,所以這裡不再詳述。本篇我們會從整體的鏈式角度來了解執行緒切換。

引入

首先,根據經驗我們知道,不論是什麼樣的呼叫鏈。它的最上層無非就是這樣:

141339_RCJQ_2398062.png

首先呼叫了subscribe進行註冊,然後observable會回撥onSubscribe方法,但是第二個步驟並不一定會如上圖這樣呼叫,下面的例子就會看到,不過並不會影響我們之後的流程分析。

然後observable通知發射源,發射源發射資料。

PS: 第四步畫得醜是有原因的,由於這些操作都是在同一個執行緒中完成的,所以不想讓連線線出現在左側!

例項

那麼我們來畫一個例項的呼叫圖,先舉一個例項類似如下

ObservableX.map.subscribeOn(Thread1).map.observeOn(Thread2).map.subscribe()

鏈挺長的,包括執行subscribe的執行緒(Thread0)總共三個執行緒。

其中ObservableX表示一個任意的Observable。這裡我們就用上面的圖代替(也許就是Observable.Create)

這張圖需要從底部開始往上看,第一步就是線上程t0中呼叫subscribe。如此往上推,一直到追溯到資料來源,資料來源開發傳送資料(通過onNext等方法)。

我們將右側的箭頭稱為上游,因為他是通過追溯的方法一步一步往上層程式碼執行的。將左側的箭頭稱為下游,因為他是反映了真實資料流從最初的發射源一步步發射的過程。

所以從上圖可知,subscribeOn方法是將上游執行緒進行排程,而observeOn方法是排程下游執行緒。

如果呼叫鏈中只定義了subscribeOn的執行緒,沒有定義observeOn的方法,那麼下游執行緒也會被subscribeOn順便改變(說順便是由於subscribeOn改變了源資料傳送的執行緒)。

如果存在observeOn,無論在subscribeOn的之前還是之後,都會改變下游執行緒。

總結

Flowable基本情況相同的!

map,lift 型別的操作符實際上實在subscribe中完成工作內容的,所以處於操作鏈後方的subscribeOn會修改前面的map中內容的執行執行緒。

最後一個observerOn會影響最終的subscribe onNext的執行執行緒

轉載於:https://my.oschina.net/zzxzzg/blog/955376