在RxJava中有5种不同的调度程序从中选择:
即时():创建并返回一个立即在当前线程上执行工作的调度程序。
蹦床():创建并返回一个调度程序,该调度程序将当前线程上的工作排队,以便在当前工作完成后执行。
新线程():创建并返回一个为每个工作单元创建一个新线程的调度程序。
计算():创建并返回用于计算工作的调度程序。这可用于事件循环、处理回调和其他计算工作。不要在此调度程序上执行 IO 密集型工作。使用调度程序。io()反而。
io():创建并返回一个用于 IO 绑定工作的调度程序。
该实现由执行器线程池支持,该线程池将根据需要增长。这可用于异步执行阻塞 IO。不要在此调度程序上执行计算工作。使用调度程序。计算()反而。
问题:
前 3 个调度程序非常不言自明;不过,我有点困惑计算 and io.
- 到底什么是“IO 密集型工作”?它是否用于处理流(
java.io
)和文件(java.nio.files
)?它用于数据库查询吗?它用于下载文件或访问 REST API 吗?
- How is 计算()不同于新线程()?难道这一切都是计算()调用每次都在单个(后台)线程上而不是新的(后台)线程上?
- 为什么打电话不好计算()什么时候做IO工作?
- 为什么打电话不好io()当做计算工作时?
很好的问题,我认为文档可以提供更多细节。
-
io()
由无界线程池支持,并且是用于非计算密集型任务的那种东西,即不会给 CPU 带来太多负载的东西。因此,与文件系统的交互、与不同主机上的数据库或服务的交互都是很好的例子。
-
computation()
由大小等于可用处理器数量的有界线程池支持。如果您尝试在多个可用处理器上并行调度 CPU 密集型工作(例如使用newThread()
)那么,当线程争夺处理器时,您就会面临线程创建开销和上下文切换开销,这可能会严重影响性能。
- 最好离开
computation()
仅适用于 CPU 密集型工作,否则您将无法获得良好的 CPU 利用率。
- 打电话不好
io()
出于 2 中讨论的原因进行计算工作。io()
是无界的,如果你在上面安排一千个计算任务io()
如果并行,那么这 1000 个任务中的每一个都将拥有自己的线程,并竞争 CPU,从而产生上下文切换成本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)