RxJava, perché 1 e 2 non arrivano in ordine in questa sequenza?
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();
Se 1 e 2 aspettano 3 secondi, perché a volte 2 viene prima e poi 1? Non dovrebbe essere sempre 1 prima?
a volte:
Element: 3
Element: 4
Element: 5
Element: 2
Element: 1
e
Element: 3
Element: 4
Element: 5
Element: 1
Element: 2
non dovrebbe uscire sempre così (3,4,5,1,2)?
Risposte
Per impostazione predefinita, l' delayoperatore utilizza lo scheduler di calcolo:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public final Observable<T> delay(long delay, TimeUnit unit) {
return delay(delay, unit, Schedulers.computation(), false);
}
Ciò significa che ogni operazione di ritardo viene eseguita in un thread preso dal pool di calcolo.
flatMapnon aspettare l'ultimo elemento è stato completamente trasformato, così per 1e 2vengono elaborati in diversi thread (presi dal pool di calcolo) in parallelo. Fili diversi significano che nessun ordine è garantito .
Tutti gli operatori basati sul tempo utilizzano lo scheduler di calcolo per impostazione predefinita. Puoi dare un'occhiata alla mia altra risposta qui