如何等待JavaRx2 Flowable完成其所有任务?

如何等待JavaRx2 Flowable完成其所有任务?,java,multithreading,asynchronous,rx-java2,Java,Multithreading,Asynchronous,Rx Java2,我正在努力学习RxJava2库的基础知识,现在我陷入了以下困境: 我已经通过Flowable.generate(…)生成了myFlowable,现在我需要等待所有任务完成执行,然后才能继续。 这是显示问题的代码: myFlowable.parallel() .runOn(Schedulers.computation()) .map(val -> myCollection.add(val)) .sequential()

我正在努力学习RxJava2库的基础知识,现在我陷入了以下困境:
我已经通过
Flowable.generate(…)
生成了
myFlowable
,现在我需要等待所有任务完成执行,然后才能继续。
这是显示问题的代码:

myFlowable.parallel()
            .runOn(Schedulers.computation())
            .map(val -> myCollection.add(val))
            .sequential()
            .subscribe(val -> {
                System.out.println("Thread from subscribe: " + Thread.currentThread().getName());
                System.out.println("Value from subscribe: " + val.toString());
            });
    System.out.println("Before sleep - Number of objects: " + myCollection.size());
    try {
        Thread.sleep(1000);
        System.out.println("After sleep - Number of objects: " + myCollection.size());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

我运行所有任务并将结果添加到集合中。如果我在myFlowable块之后检查集合大小,那么它将不同,如果我在small
Thread.sleep()之后检查集合大小,则它将不同。是否有任何方法可以检查所有任务是否已完成执行,我们是否可以继续?任何帮助或指导都将不胜感激。

由于RxJava是异步的,下面的java代码observable将运行,而observable将在另一个线程中运行。这就是为什么如果Flowable已完成发送数据,您希望收到通知,则应在RxJava流中执行该操作。为此,你有一个接线员 这里有一个如何检测流何时完成的示例

        Flowable.range(0, 100).parallel()
            .runOn(Schedulers.computation())
            .map(integer -> {

                return integer;
            })
            .sequential()
            .doOnComplete(() -> {
                System.out.println("finished");
            })
            .subscribe(integer -> System.out.println(integer));

您可以使用AtomicBoolean,将其初始化为false,然后使用
doFinally()
将其设置为true

doFinally()
在可观测信号onError或onCompleted或被下游处理后调用

然后休眠主线程,直到
completed
值为true

以您的例子:

AtomicBoolean completed=新的AtomicBoolean(false);
myFlowable.parallel()
.runOn(Schedulers.computation())
.map(val->myCollection.add(val))

.doFinally(()->completed.set(true))
.订阅(val->{
...
});
...
试一试{
而(!completed.get()){
睡眠(1000);
...
}
...
}捕捉(中断异常e){
e、 printStackTrace();
}