为什么它们被用于不同类型的任务?在处理计算任务与io任务时,它们有何不同?
Schedulers.computation() - 用于计算工作,如 事件循环和回调处理;不要将此调度程序用于I / O. (使用Schedulers.io()代替);默认情况下,线程数是 等于处理器数量
Schedulers.io() - 用于I / O绑定的工作,例如异步 阻塞I / O的性能,此调度程序由线程池支持 将根据需要增长;对于普通的计算工作,切换到 Schedulers.computation(); Schedulers.io()默认为 CachedThreadScheduler,类似于新的线程调度程序 使用线程缓存
答案 0 :(得分:8)
I / O和Computation是非常不同的工作负载。
计算完全是CPU限制的,因此您希望限制线程数,以便它们不会战胜CPU并使自己饿死。如果你有1000个线程都试图在8个核心上工作,那么你可能会遇到困难。 Schedulers.computation()的上限为核心数。
I / O是不同的,因为虽然它们通常需要一个用于维护上下文的线程,但它们并不真正使用CPU - 它们只是睡眠直到I / O完成。在单核机器上进行1000次I / O操作是完全没问题的,因为它们在大多数时间都处于睡眠状态。 Schedulers.io()是无上限的,并且会根据需要生成尽可能多的线程
答案 1 :(得分:0)
最重要的一点是Schedulers.io和Schedulers.computation都由无限制的自动回收线程池支持。如果执行程序是使用newCachedThreadPool(不受自动回收线程池限制)创建的,则只有Scheduler.from(Executor)共享此特征。
默认情况下,Schedulers.computation 配置的线程数量等于可用CPU的数量,因此计算将尽可能快地执行。您可以增加此数量,但可能会导致线程切换开销并减慢计算速度。
对于 Schedulers.io ,您应该仅将其用于阻止I / O操作,因为它们会阻止调用线程。如果您的I / O调用是通过异步或反应性API进行的,则不要使用它,因为没有机制可以在 Scheduler.io 上进行回调。
话虽如此,这些调度程序的重要作用是为 flatMap()运算符提供多线程上下文,从而在反应流的核心实现并发。
通过类似的问题here和有关RxJava2 Schedulers和Concurrency的文章查找更多详细信息,您可以在其中找到详细的说明和代码示例。
希望这会有所帮助,
Softjake