RxJava,为什么 1 和 2 在这个序列中不按顺序到达?
RxJava, why 1 and 2 don't arrive in order in this sequence?
Observable.just(1, 2, 3, 4, 5)
.flatMap(
a -> {
if (a < 3) {
return Observable.just(a).delay(3, TimeUnit.SECONDS);
} else {
return Observable.just(a);
}
})
.doOnNext(
a -> System.out.println("Element: " + a )
.subscribe();
如果1和2等了3秒,为什么有时候2先到后1?不应该永远是 1 吗?
有时:
Element: 3
Element: 4
Element: 5
Element: 2
Element: 1
和
Element: 3
Element: 4
Element: 5
Element: 1
Element: 2
不应该一直这样出去吗(3,4,5,1,2)?
默认情况下 delay
运算符使用计算调度程序:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public final Observable<T> delay(long delay, TimeUnit unit) {
return delay(delay, unit, Schedulers.computation(), false);
}
这意味着每个延迟操作都在从计算池中取出的线程中执行。
flatMap
不等待最后一项被完全处理,所以对于 1
和 2
它们在不同的线程(从计算池中获取)并行处理。 不同线程意味着无法保证顺序。
默认情况下,所有基于时间的运算符都使用计算调度程序。你可以看看我的另一个回答
Observable.just(1, 2, 3, 4, 5)
.flatMap(
a -> {
if (a < 3) {
return Observable.just(a).delay(3, TimeUnit.SECONDS);
} else {
return Observable.just(a);
}
})
.doOnNext(
a -> System.out.println("Element: " + a )
.subscribe();
如果1和2等了3秒,为什么有时候2先到后1?不应该永远是 1 吗?
有时:
Element: 3
Element: 4
Element: 5
Element: 2
Element: 1
和
Element: 3
Element: 4
Element: 5
Element: 1
Element: 2
不应该一直这样出去吗(3,4,5,1,2)?
默认情况下 delay
运算符使用计算调度程序:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public final Observable<T> delay(long delay, TimeUnit unit) {
return delay(delay, unit, Schedulers.computation(), false);
}
这意味着每个延迟操作都在从计算池中取出的线程中执行。
flatMap
不等待最后一项被完全处理,所以对于 1
和 2
它们在不同的线程(从计算池中获取)并行处理。 不同线程意味着无法保证顺序。
默认情况下,所有基于时间的运算符都使用计算调度程序。你可以看看我的另一个回答