observeOn和subscribeOn方法將Scheduler做爲參數。顧名思義,Scheduler是一種用來安排執行各個操做的工具。將如何調用操做的細節取決於所使用的Scheduler的實現。您能夠建立本身的Scheduler實現,但大多數時候您會發現RxJava已經爲您提供了一組針對常見狀況的Scheduler。您能夠從Scheduler上的工廠方法獲取現有實現。ios
現有的Scheduler以下:git
在當前實現中,computation和io調度器實際上不是單一實現。這種分離的關鍵是要有不一樣的實例,同時也記錄你的意圖。github
許多Rx operators都在內部使用schedules。您到目前爲止看到的Observable運算符,全部異步運算符都有重載調度程序。您能夠指定每一個operator使用的schedules。異步
用於Rx schedule的方法和實現不是特定於Rx的。實際上,它們比較標準,能夠在沒有任何Rx代碼的狀況下使用。除了設計自定義異步操做符以外,一般沒必要直接使用schedule。在自定義運算符中使用schedule不只方便,並且還容許異步運算符變得可測試。工具
createWorker()部分有點趣的,它返回一個Scheduler.Worker。worker接受操做並在單個線程上按順序執行它們。在某種程度上,worker自己就是一個schedule,但咱們不會將其稱爲schedule以免混淆。測試
而後,該操做將排隊等待在分配了該worker的線程上執行。spa
正如您對schedule所指望的那樣,您還可使用如下方法安排一次或重複執行的操做:線程
咱們能夠在這裏看到,執行的延遲是從調度時刻開始計算的。指定的時間不是任務之間的強制睡眠時間。若是有工做準備好執行,worker人能夠同時工做。設計
Scheduler.Worker繼承啦Subscription。在worker上調用unsubscribe方法將致使隊列被清空而且全部待處理的任務都被取消。咱們能夠經過修改前面的例子來看到。調試
第二個任務永遠不會被執行,由於它以前的任務取消了一切。正在執行的操做將被中斷。在下一個示例中,咱們將建立一個睡眠時間爲2000毫秒的任務。在它開始執行後500ms咱們取消了對工人的全部工做。這會致使InterruptedException
正如看到的那樣,schedule返回Subscription。您能夠經過在安排時建立的Subscription取消單個任務。
ImmediateScheduler根本不作任何調度。scheduler只是同步執行操做,並在操做完成時返回。嵌套的調度請求將致使以遞歸方式執行操做。
輸出:
TrampolineScheduler的worker也是同步的,但不會嵌套任務。相反,它從初始任務開始,執行時調度的任何任務將在當前任務完成後排隊等候。
輸出:
NewThreadScheduler建立每一個都有本身的線程的工做者。每一個計劃任務都將在與該特定工做者相對應的線程上執行。
輸出:
下屆再續!
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/1.%20Scheduling%20and%20threading.md