RxJava threading<二十七>

由於Rx針對異步系統設計,而且Rx也天然支持多線程,因此新的Rx開發人員有時會假設Rx默認是多線程的。在其餘任何事情以前,重要的是澄清Rx默認是單線程的。ios

除非另有說明,不然每次調用onNext / onError / onCompleted都會同步執行整個運算符鏈,包括最終subscriber的操做。咱們能夠看到比如下示例:git

輸出:github

咱們在這裏看到,咱們從3個不一樣的線程中調用了onNext。每次訂閱者的操做都在第一個onNext調用來自的同一個線程上執行。不管咱們將多少個連接在一塊兒,狀況也是如此。除非咱們另有請求,不然該值將同步。多線程

subscribeOn 和 observeOn

subscribeOn和observeOn容許您控制訂閱的調用和通知的接收(什麼線程將在您的觀察者上調用onNext / onError / onCompleted)。異步

在Rx中,您不直接處理線程。而是將它們包裝在名爲Scheduler的策略中。咱們稍後會看到更多。函數

subscribeOn

使用subscribeOn,您能夠決定執行Observable.create的Scheduler。即便你不是本身調用create,也有內在的等價。請考慮如下示例spa

輸出:線程

咱們在這裏看到,不只一切都在同一個線程上執行,它其實是順序的:在完成訂閱)observable(包括執行create的lambda參數的主體)以前,subscribe不會解除阻塞。在lambda中對onNext的調用會執行整個運算符鏈,一直到println。實際上,訂閱已建立的observable是阻塞的。設計

不管您要求什麼,一些可觀察者都會建立本身的線程。例如,Observable.interval是異步的。在這種狀況下,subscribeOn將指定運行建立資源的函數的線程,這一般是沒有用的。它使您沒法控制將租用的資源。對象

輸出:

observeOn

observeOn控制管道的另外一側。值的建立和發送將正常工做,可是您的觀察器的操做將在調度程序策略指定的不一樣線程上調用。

輸出:

與subscribeOn不一樣,observeOn的效果不會跳轉到管道的開頭。它只是改變了它以後的運算符的線程。您能夠將其視爲攔截事件並更改鏈的其他部分的線程。這是一個例子:

輸出;

咱們能夠在這裏看到事件從調用onNext的線程開始並保持在該線程上,直到它們遇到observeOn運算符。以後,他們繼續新線程。這樣,您能夠將不一樣的線程策略分配給Rx管道的不一樣部分。

unsubscribeOn

正如咱們所看到的,一些可觀察對象依賴於訂閱租用的資源,並在訂閱結束時釋放。一般,釋放資源很便宜。在特殊狀況下,您須要取消訂閱操做以不阻止或特定地發生在特殊線程上,您能夠指定將使用unsubscribeOn執行這些操做的調度程序。

輸出:

using方法執行3個函數,一個租用資源,一個使用它,另外一個釋放它。使用unsubscribeOn,咱們隻影響了釋放資源的功能。

下節再續!

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/1.%20Scheduling%20and%20threading.md

相關文章
相關標籤/搜索