tmn
tmn

Reputation: 11559

Why is my RxJava observable not firing off subscribers?

I'm messing around with RxJava and I want to stream a thousand consecutive integers. Then I want to asynchronously split them into odd and even streams, and then print them asynchronously.

However, I'm getting nothing printed out or at least very partial output. What am I missing? Did I schedule incorrectly? Or is the console having multithreading issues in Eclipse?

public static void main(String[] args)  {

    List<Integer> values = IntStream.range(0,1000).mapToObj(i -> Integer.valueOf(i)).collect(Collectors.toList());

    Observable<Integer> ints = Observable.from(values).subscribeOn(Schedulers.computation());

    Observable<Integer> evens = ints.filter(i -> Math.abs(i) % 2 == 0);
    Observable<Integer> odds = ints.filter(i -> Math.abs(i) % 2 != 0);

    evens.subscribe(i -> System.out.println(i + " IS EVEN " + Thread.currentThread().getName()));

    odds.subscribe(i -> System.out.println(i + " IS ODD " + Thread.currentThread().getName()));
}

Upvotes: 1

Views: 329

Answers (1)

Piotrek Bzdyl
Piotrek Bzdyl

Reputation: 13175

You are starting the processing pipeline using Schedules.computation which runs daemon threads. Thus when your main thread finishes, those threads are terminated before processing your observable.

So if you would like to see your results printed you could have your main thread wait for the results (e.g. by Thread.sleep) or subscribe on the calling thread by removing subscribeOn. There is also an option to create your own scheduler which will run non-daemon threads.

Upvotes: 3

Related Questions