rxJava调度程序用例
在RxJava中有5种不同的调度程序可供select:
immediate() :创build并返回在当前线程上立即执行工作的调度程序。
trampoline() :创build并返回一个调度程序,该调度程序在当前工作完成后执行当前线程上的队列。
newThread() :创build并返回一个Scheduler,为每个工作单元创build一个新的Thread。
计算() :创build并返回一个调度程序,用于计算工作。 这可以用于事件循环,处理callback和其他计算工作。 不要在此调度程序上执行IO绑定的工作。 使用调度程序。 io()代替。
io() :创build并返回用于IO绑定工作的计划程序。 该实现由Executor线程池支持,该线程池将根据需要增长。 这可以用于asynchronous执行阻塞IO。 不要在这个调度器上执行计算工作。 使用调度程序。 计算()代替。
问题:
前三个调度程序非常自我解释, 然而,我对计算和io有点困惑。
- 什么是“IO绑定的工作”? 它用于处理stream(
java.io
)和文件(java.nio.files
)? 它用于数据库查询吗? 用于下载文件还是访问REST API? - comput()与newThread()有什么不同? 是所有的计算()调用是在一个单一的(后台)线程而不是一个新的(后台)线程每次?
- 为什么在做IO工作时调用comput()是不好的?
- 为什么在做计算工作时调用io()是不好的?
很好的问题,我认为文档可以做更多的细节。
-
io()
是由一个无界线程池支持的,并且是用于非计算密集型任务的东西,也就是不会对CPU造成太大负担的东西。 因此,与文件系统的交互,与不同主机上的数据库或服务的交互是很好的例子。 -
computation()
由大小等于可用处理器数量的有界线程池支持。 如果您尝试在多于可用处理器的情况下(例如使用newThread()
)并行调度cpu密集型工作,那么您将面临线程创build开销和上下文切换开销,因为线程争夺处理器,这可能会造成很大的性能下降。 - 最好只将CPU的
computation()
CPU上,否则CPU的利用率不会很高。 - 因为
io()
是无界的,所以把io()
称为计算工作是不好的。如果你并行地在io()
上计划了一千个计算任务,那么每一个任务都有自己的线程,竞争CPU导致上下文切换成本。