RxJava Schedulers <二十八>

Schedulers

observeOn和subscribeOn方法将Scheduler做为参数。顾名思义,Scheduler是一种用来安排执行各个操做的工具。将如何调用操做的细节取决于所使用的Scheduler的实现。您能够建立本身的Scheduler实现,但大多数时候您会发现RxJava已经为您提供了一组针对常见状况的Scheduler。您能够从Scheduler上的工厂方法获取现有实现。ios

现有的Scheduler以下:git

  • immediate 同步执行Scheduler操做。
  • trampoline 队列在当前线程完成以后执行。
  • newThread 为每一个计划的工做单元建立一个新线程。
  • computation 用于cpu工做
  • io 用于io工做
  • test 用于测试和调试

在当前实现中,computation和io调度器实际上不是单一实现。这种分离的关键是要有不一样的实例,同时也记录你的意图。github

许多Rx operators都在内部使用schedules。您到目前为止看到的Observable运算符,全部异步运算符都有重载调度程序。您能够指定每一个operator使用的schedules。异步

Advanced features of schedulers

用于Rx schedule的方法和实现不是特定于Rx的。实际上,它们比较标准,能够在没有任何Rx代码的状况下使用。除了设计自定义异步操做符以外,一般没必要直接使用schedule。在自定义运算符中使用schedule不只方便,并且还容许异步运算符变得可测试。工具

createWorker()部分有点趣的,它返回一个Scheduler.Worker。worker接受操做并在单个线程上按顺序执行它们。在某种程度上,worker自己就是一个schedule,但咱们不会将其称为schedule以免混淆。测试

Scheduling an action

而后,该操做将排队等待在分配了该worker的线程上执行。spa

正如您对schedule所指望的那样,您还可使用如下方法安排一次或重复执行的操做:线程

咱们能够在这里看到,执行的延迟是从调度时刻开始计算的。指定的时间不是任务之间的强制睡眠时间。若是有工做准备好执行,worker人能够同时工做。设计

Canceling work

Scheduler.Worker继承啦Subscription。在worker上调用unsubscribe方法将致使队列被清空而且全部待处理的任务都被取消。咱们能够经过修改前面的例子来看到。调试

第二个任务永远不会被执行,由于它以前的任务取消了一切。正在执行的操做将被中断。在下一个示例中,咱们将建立一个睡眠时间为2000毫秒的任务。在它开始执行后500ms咱们取消了对工人的全部工做。这会致使InterruptedException

正如看到的那样,schedule返回Subscription。您能够经过在安排时建立的Subscription取消单个任务。

ImmediateScheduler

ImmediateScheduler根本不作任何调度。scheduler只是同步执行操做,并在操做完成时返回。嵌套的调度请求将致使以递归方式执行操做。

输出:

TrampolineScheduler

TrampolineScheduler的worker也是同步的,但不会嵌套任务。相反,它从初始任务开始,执行时调度的任何任务将在当前任务完成后排队等候。

输出:

NewThreadScheduler

NewThreadScheduler建立每一个都有本身的线程的工做者。每一个计划任务都将在与该特定工做者相对应的线程上执行。

输出:

下届再续!

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

相关文章
相关标签/搜索