当前位置: 首页 > 知识库问答 >
问题:

RxJava调度程序用例

薛阳荣
2023-03-14

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

>

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

    trampoline():创建并返回一个调度程序,该调度程序将当前线程上的工作排队,以便在当前工作完成后执行。

    newThread():创建并返回一个调度程序,该调度程序为每个工作单元创建一个新线程。

    计算():创建并返回一个用于计算工作的调度程序。这可以用于事件循环、处理回调和其他计算工作。不要在此计划程序上执行IO绑定工作。请改用schedulers.io()。

    io():创建并返回用于io绑定工作的调度程序。实现由执行器线程池支持,执行器线程池将根据需要增长。这可用于异步执行阻塞IO。不要在此计划程序上执行计算工作。请改用Schedulers.Computation()。

    前三个时间表是相当自我解释的;但是,我对计算和IO有点困惑。

    1. “IO绑定工作”到底是什么?它是否用于处理流(java.io)和文件(java.nio.files)?是否用于数据库查询?是否用于下载文件或访问REST API?
    2. 计算()与newThread()有何不同?是否所有计算()调用都在一个(后台)线程上,而不是每次都在一个新的(后台)线程上?
    3. 为什么在执行IO工作时调用computation()不好?
    4. 为什么在进行计算工作时调用io()不好?
  • 共有1个答案

    卢志业
    2023-03-14

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

    1. io()由一个无界线程池支持,并且是用于非计算密集型任务的那种东西,即不会给CPU带来太多负载的东西。因此,与文件系统的交互、与不同主机上的数据库或服务的交互都是很好的例子。
    2. computation()由大小等于可用处理器数量的有界线程池支持。如果您试图在多个可用处理器之间并行调度CPU密集型工作(例如使用newthread()),那么您将面临线程创建开销和上下文切换开销,因为线程争夺处理器,这可能会对性能造成很大打击。
    3. 最好将computation()仅用于CPU密集型工作,否则您将无法获得良好的CPU利用率。
    4. 为计算工作调用io()是不好的,原因在2中讨论过。io()是无界的,如果您在io()上并行调度一千个计算任务,那么这一千个任务中的每一个都将有自己的线程,并竞争CPU,从而导致上下文切换成本。
     类似资料:
    • 我必须根据传入的请求写入文件。由于多个请求可能同时出现,我不希望多个线程试图一起覆盖文件内容,这可能会导致丢失一些数据。 因此,我尝试使用实例变量PublishSubject收集所有请求的数据。我在初始化期间订阅了publishSubject,此订阅将在应用程序的整个生命周期内保持不变。此外,我还在一个单独的线程(由Vertx事件循环提供)上观察到相同的实例,该线程调用负责编写文件的方法。 稍后在

    • 问题内容: 我正在使用Retrofit为异步网络调用返回rxjava Observable。 我发现自己在重复以下调用: 似乎我一直在订阅IO线程,并在Android主线程上进行观察。这似乎是我发现的所有资源都倡导的最佳实践。也许除了长时间运行的计算外,我不太了解何时要偏离此模式。 有没有一种方法可以通过默认subscriptionOn和observeOn线程来删除此样板? 这是rxjava插件的

    • 我正在使用改型为我的异步网络调用返回rxjava Observable。 我发现自己重复以下调用: 似乎我总是在IO线程上订阅,在Android主线程上观察。这似乎是我找到的所有资源都提倡的最佳实践。也许除了长时间运行的计算之外,我不太明白我们什么时候会想要偏离这种模式。 有没有办法通过默认subscribeOn和observeOn线程来删除这个样板文件? 这是rxjava插件的用例吗?(我找不到

    • 调度器在多线程环境中用于与 Observable 操作符一起工作。 根据Reactive,Scheduler 用于调度运算符链如何应用于不同的线程。 默认情况下,一个 Observable 和你应用到它的操作符链将在调用它的 Subscribe 方法的同一个线程上完成它的工作,并通知它的观察者。SubscribeOn 运算符通过指定 Observable 应在其上运行的不同调度程序来更改此行为。O

    • 我正在做一个项目,我们计划使用WLP (WebSphere liberty)代替传统的WAS。 代码使用 WAS 调度程序来调度活动。 liberty 是否也具有与 WAS 中存在的相同级别的调度程序支持/功能? 如何将调度程序任务从webphere迁移到自由?

    • 我是RxJava新手,目前正在使用RxJava版本1。我的用例就像我必须进行一次rest API调用(使用rest模板)。因此,使用调度器是更好的主意吗。在这种情况下,每次都可以使用computation()或任何调度器。 我的课程是 SampleController。Java语言 服务Java语言 在这里,我使用Schedulers来启动新线程。但我再次使用延迟结果进行即时响应,Spring将把