【问题标题】:Why is my RxJava observable not firing off subscribers?为什么我的 RxJava observable 没有触发订阅者?
【发布时间】:2015-05-05 03:12:28
【问题描述】:

我在搞乱 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()));
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • ohhhh...好吧,我需要告诉主线程然后等待。等一下,让我试试看。
    • 或者订阅当前线程而不是另一个调度器。让我更新答案。
    • 我在main() 方法的末尾添加了一个Thread.sleep(),只是为了让流有机会运行。谢谢!它奏效了。
    • 我试图模拟一个异步环境,所以我不希望它在主线程上运行。我想我希望应用程序能够像尚未关闭的线程池一样保持活跃。
    • @ThomasN。 Scheduler 只是专门针对 Rx 需求设计的抽象,并没有将 1:1 转换为 ExecutorService 的设计目的。你其实可以create a scheduler from an executor
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多