Map2: RxCachedThreadScheduler-1 onNext: RxCachedThreadScheduler-1 onComplete: RxCachedThreadScheduler-1 Observable.just("Hello") .filter(s1 -> true) .subscribeOn(Schedulers.newThread()) .map(s -> s.length()) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread()) .doOnCompleted(() -> { System.out.printf("OnCompleted: %s", currentThread().getName()); }) .filter(s1 -> true) .observeOn(Schedulers.io()) .map(length -> String.valueOf(length)) .subscribe(length -> { System.out.printf("onNext: %s", currentThread().getName()); }, throwable -> { System.out.printf("onError: %s", currentThread().getName()); }, () -> { System.out.printf("onComplete: %s", currentThread().getName()); });