RxJava, neden 1 ve 2 bu sırayla gelmiyor?

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();

1 ve 2 3 saniye beklerse, neden bazen 2 önce gelir sonra 1 gelir? Her zaman 1'inci olması gerekmez mi?

ara sıra:

Element: 3
Element: 4
Element: 5
Element: 2
Element: 1

ve

Element: 3
Element: 4
Element: 5
Element: 1
Element: 2

hep böyle çıkmamalı mı (3,4,5,1,2)?

Yanıtlar

1 bubbles Sep 24 2020 at 14:56

Varsayılan olarak delayoperatör hesaplama planlayıcı kullanır:

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.COMPUTATION)
    public final Observable<T> delay(long delay, TimeUnit unit) {
        return delay(delay, unit, Schedulers.computation(), false);
    }

Bu, her gecikme işleminin hesaplama havuzundan alınan bir iş parçacığında yürütüldüğü anlamına gelir.

flatMapson öğenin tamamen işlenmesini beklemeyin, Öyleyse 1ve 2paralel olarak farklı iş parçacıklarında (hesaplama havuzundan alınan) işlenirler. Farklı iplikler, siparişin garanti edilmediği anlamına gelir .

Tüm zaman tabanlı operatörler varsayılan olarak hesaplama planlayıcı kullanır. Buradaki diğer cevabıma bir göz atabilirsiniz.