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