使用RxJava进行多次Observable执行

时间:2017-10-28 15:28:34

标签: java rx-java

我有两个Observables定义,我正在调用它们如下:

Observable<Boolean> statusObser1 = reactiveApiConsumer.syncGradesSet1(subListDtos.get(0));
Observable<Boolean> statusObser2 = reactiveApiConsumer.syncGradesSet2(subListDtos.get(1));
statusObser1.toBlocking().first();
statusObser2.toBlocking().first();

但问题是statusObser2仅在statusObser1完成后执行。相反,我希望两个观察者并行执行,即statusObser2不应等待statusObser1完成。

2 个答案:

答案 0 :(得分:2)

他们按顺序执行,因为您正在阻止(toBlocking())并等待他们的回复。

相反,订阅它们。单独:

Observable<Boolean> statusObser1 = ...
Observable<Boolean> statusObser2 = ...
statusObser1.subscribe(System.out::println); //Example
statusObser2.subscribe(System.out::println); //Example

或使用Zip运算符:

public static int doSomethingWithBothValues(Boolean a, Boolean b) {
    ...
}

...

Observable<Boolean> statusObser1 = ...
Observable<Boolean> statusObser2 = ...
Observable.zip(statusObser1,statusObser2, this::doSomethingWithBothValues);

查看有关Zip运算符here的详细信息。

在这两种情况下,如果observable是异步的,它们将并行执行。

您可以使用其他运算符来合并运算符的结果,而不会阻止其中任何一个运算符。

答案 1 :(得分:0)

尝试MultiThreading。

Observable<Boolean> statusObser1 = reactiveApiConsumer.syncGradesSet1(subListDtos.get(0));
Observable<Boolean> statusObser2 = reactiveApiConsumer.syncGradesSet2(subListDtos.get(1));
startThread(statusObser1);
startThread(statusObser2);

public void startThread(Observable<Boolean> statusObser) {
    new Thread() {
        @Override
        public void run() {
            statusObser.toBlocking().first();
        }
    }.start();
}

startThread方法将在新的Thread中执行执行,并且两个执行都将在单独的Thread中执行。