为什么我的RxJava可观察不会触发订阅者?

时间:2015-05-04 18:27:50

标签: java multithreading asynchronous reactive-programming rx-java

我正在搞乱RxJava,我想要传输一千个连续的整数。然后我想异步将它们分成奇数和偶数流,然后异步打印它们。

然而,我没有打印出任何内容或至少非常部分输出。我错过了什么?我的安排不正确吗?或者控制台是否在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()));
}

1 个答案:

答案 0 :(得分:3)

您正在使用运行守护程序线程的Schedules.computation启动处理管道。因此,当您的main线程完成时,这些线程将在处理您的observable之前终止。

因此,如果您希望打印结果,可以让主线程等待结果(例如Thread.sleep)或通过删除subscribeOn订阅调用线程。还有一个选项可以创建自己的调度程序,它将运行非守护程序线程。