RxJava调度器的选择

前提:

在RxJava中有5种不一样的调度程序可供选择:html

  1. immediate():建立并返回一个在当前线程上当即执行工做的Scheduler。
  2. trampoline():建立并返回一个Scheduler ,该Scheduler 所在线程并不会当即工做,而是要等待咱们所设定的等待时间结束后才能够执行(默认为0),固然,这个延时设置是要设定在Runnable实现内部。还有一点就是全部任务要添加到一个队列中,而后依次执行便可。
  3. newThread():建立并返回一个Scheduler,为每一个任务建立一个新的Thread。
  4. computation():建立并返回用于计算工做的Scheduler。它能够用于事件循环,处理回调和其余计算工做。注意不要使用该Scheduler执行IO类型的工做,对此,咱们能够使用io() 代替。
  5. io() :建立并返回一个用于IO类型工做的Scheduler。该实现维护了一个Executor线程池,该线程池可根据须要增加。该Scheduler可用于异步执行阻塞IO。不要使用该Scheduler执行计算任务。

问题:

前3个Scheduler解释的很是到位,对computation()io() 有点困惑。java

  1. 究竟什么是“IO-bound work”?它适用于处理streams(java.io)和files(java.nio.files)吗?适用于数据库查询吗?适用于下载文件仍是访问REST API?
  2. computation()newThread() 有什么不一样之处?
  3. 为何在进行IO任务时调用computation() 会很糟糕?
  4. 为何在进行计算任务时调用io() 会很糟糕?

答案:

很棒的问题,我认为文档能够提供更多细节。react

  1. io()由无限制线程数量的线程池支持,用于执行非计算密集型任务,这些任务不会对CPU形成太大负担(好比主板上的南北桥芯片,南桥芯片主要负责软驱、硬盘、键盘以及附加卡的数据交换)。所以,与文件系统的交互,与不一样主机上的数据库或服务的交互就是很好的适用场景。
  2. computation()由有限数量的线程池支持,其大小等于可用处理器的数量。若是你试图在可用处理器以外并行安排cpu密集型工做(好比使用newThread()),那么当线程争夺处理器时,你就会面临线程建立开销和上下文切换开销,而且它可能会受到很大的性能影响。
  3. 最好只留下computation()CPU密集型工做,不然你将没法得到良好的CPU利用率。
  4. io()根据2中所讲,在进行计算任务时使用io()是很很差的,若是你io()并行安排了一千个计算任务,那么这千个任务中的每个都将拥有本身的线程并争夺CPU产生的上下文切换成本。

本文配套拓展视频讲解:数据库

Rxjava问题集之RxJava调度器的选择01异步

Rxjava问题集之RxJava调度器的选择02ide

相关文章
相关标签/搜索