【问题标题】:Does rx-java IO Scheduler maintains order?rx-java IO Scheduler 是否维护顺序?
【发布时间】:2020-04-14 23:04:47
【问题描述】:

我想知道Schedulers.io()是否会按照调用者的顺序执行任务。

public class SaveTest {

    @Inject
    private MyRepository myRepository;

    public void save()  {
        Observable.range(0, 20)
                .map(l -> new MyModel(l))
                .observeOn(Schedulers.io())
                .subscribe(myRepository::save);
    }
}

插入新数据时,即使不遵守顺序也没有问题。但是在更新 ex 时:

    BankAccount account = new BankAccount();
    account.deposit(500);
    account.withdraw(50);

每个操作都会在反应流中保存,顺序非常重要。

我的问题是:IO 调度器是否维持秩序?

【问题讨论】:

    标签: java rx-java rx-java2


    【解决方案1】:

    是的,响应式流会维护事件的顺序,即使您像这样将事件移交给不同的调度程序。

    在内部,事件被放入队列中,调度程序 (as documented here) 选择的单线程工作人员按顺序从队列中提取它们。

    【讨论】:

    • 所以每次我们调用.observeOn(Schedulers.io()) 时,它都会从池中窥视一个线程,并且该线程将按照发射的顺序接收事件?
    • 基本上是的。从技术上讲,线程是在您订阅时选择的,而不是在您调用 observeOn 时选择的。
    • 其他调度器也是这样吗?
    • 所有内置调度程序都记录了它们使用单​​线程工作程序,但您可以使用 Schedulers.from 创建具有多线程工作程序的自定义调度程序 - 文档警告您:“但是,请注意,如果提供的 ScheduledExecutorService 实例不是单线程的,以彼此接近的时间延迟调度的任务最终可能以与发出原始 schedule() 调用不同的顺序执行。"
    猜你喜欢
    • 2011-03-29
    • 2011-09-18
    • 1970-01-01
    • 2016-02-27
    • 2011-04-11
    • 2011-04-09
    • 2016-08-29
    • 2017-12-05
    相关资源
    最近更新 更多