有许多操作符默认使用一些Scheduler。通常情况下,通常在如果没有提供的时候会使用Schedulers.computation()——JavaDoc解释的很清楚。例如,delay()操作符接收上游事件并在给定的时间后将它们推到下游。显然,在此期间它不能保留原始线程,因此必须使用不同的Scheduler:

Observable
    .just('A', 'B')
    .delay(1, SECONDS, schedulerA)
    .subscribe(this::log);

如果不提供自定义的schedulerA,所有在delay()操作符之后的操作符将使用computation() Scheduler。这并没有什么内在的错误;但是,如果您的订阅者在I / O上被阻塞,那么它将消耗一个来由全局共享的计算Scheduler提供的Worker,可能会影响整个系统。支持自定义调度器的其他重要的操作符有:interval()、range()、timer()、repeat()、skip()、take()、timeout()以及其他尚未引入的其他操作。如果您不向这些操作程序提供调度程序,则使用computation() Scheduler,这在大多数情况下是安全的默认值。

掌握Scheduler对于使用RxJava编写可伸缩和安全的代码至关重要。subscribeOn()和observeOn()之间的区别在高负载下尤其重要,因为每个任务都必须在我们期望的时候精确地执行。在真正的响应式应用程序中,所有长时间运行的操作都是异步的,只需要很少的线程和因此而来的Schedulers 。但是总有一个API或依赖关系需要阻塞代码。

最后但并非最不重要的一点是,我们必须确保使用下游的Schedulers可以与上游Schedulers生成的负载保持同步。但这里的危险将在第六章中详细说明。

results matching ""

    No results matching ""