rxJava调度程序用例

在RxJava中有5种不同的调度程序可供select:

  1. immediate() :创build并返回在当前线程上立即执行工作的调度程序。

  2. trampoline() :创build并返回一个调度程序,该调度程序在当前工作完成后执行当前线程上的队列。

  3. newThread() :创build并返回一个Scheduler,为每个工作单元创build一个新的Thread。

  4. 计算() :创build并返回一个调度程序,用于计算工作。 这可以用于事件循环,处理callback和其他计算工作。 不要在此调度程序上执行IO绑定的工作。 使用调度程序。 io()代替。

  5. io() :创build并返回用于IO绑定工作的计划程序。 该实现由Executor线程池支持,该线程池将根据需要增长。 这可以用于asynchronous执行阻塞IO。 不要在这个调度器上执行计算工作。 使用调度程序。 计算()代替。

问题:

前三个调度程序非常自我解释, 然而,我对计算io有点困惑。

  1. 什么是“IO绑定的工作”? 它用于处理stream( java.io )和文件( java.nio.files )? 它用于数据库查询吗? 用于下载文件还是访问REST API?
  2. comput()newThread()有什么不同? 是所有的计算()调用是在一个单一的(后台)线程而不是一个新的(后台)线程每次?
  3. 为什么在做IO工作时调用comput()是不好的?
  4. 为什么在做计算工作时调用io()是不好的?

很好的问题,我认为文档可以做更多的细节。

  1. io()是由一个无界线程池支持的,并且是用于非计算密集型任务的东西,也就是不会对CPU造成太大负担的东西。 因此,与文件系统的交互,与不同主机上的数据库或服务的交互是很好的例子。
  2. computation()由大小等于可用处理器数量的有界线程池支持。 如果您尝试在多于可用处理器的情况下(例如使用newThread() )并行调度cpu密集型工作,那么您将面临线程创build开销和上下文切换开销,因为线程争夺处理器,这可能会造成很大的性能下降。
  3. 最好只将CPU的computation() CPU上,否则CPU的利用率不会很高。
  4. 因为io()是无界的,所以把io()称为计算工作是不好的。如果你并行地在io()上计划了一千个计算任务,那么每一个任务都有自己的线程,竞争CPU导致上下文切换成本。