RxJava, perché 1 e 2 non arrivano in ordine in questa sequenza?

Sep 24 2020
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

1 bubbles Sep 24 2020 at 14:56

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