使用RxJava在阵列上异步forEach

使用RxJava在阵列上异步forEach,java,rx-java,Java,Rx Java,我正在尝试迭代一组映射并执行一些异步操作。我已经尝试了一些使用RxJava库的方法,但是我尝试的所有方法似乎都是同步的。我试图避免手动创建新线程,并希望让RxJava处理它。这就是我到目前为止所尝试的 Observable.from(new Map[20]) .subscribeOn(Schedulers.newThread()) .observeOn(Schedulers.computation()) .forEach(

我正在尝试迭代一组映射并执行一些异步操作。我已经尝试了一些使用RxJava库的方法,但是我尝试的所有方法似乎都是同步的。我试图避免手动创建新线程,并希望让RxJava处理它。这就是我到目前为止所尝试的

Observable.from(new Map[20])
            .subscribeOn(Schedulers.newThread()) 
            .observeOn(Schedulers.computation())
            .forEach(batch -> {
                try {
                    System.out.println(1);
                    Thread.sleep(3000);
                    System.out.println(2);
                } catch (Exception e) {

                }
            });




当我使用上面的代码运行单元测试时,我会看到以下输出

1
2
1
2
1
2
...
我想看到的是

1
1
1
... 
2
2
2

如何使用RxJava在映射数组上异步迭代?

您可以实现从可观察到可流动的转换,并使用并行:

        Flowable.fromIterable(array)
                .parallel(3) // number of items in parallel
                .runOn(Schedulers.newThread()) // the desired scheduler
                .map(item -> {
                    try {
                        System.out.println(1);
                        Thread.sleep(3000);
                        System.out.println(2);
                    } catch (Exception e) {

                    }

                    return Completable.complete();
                })
        .sequential().subscribe();

如果您无法使用RxJava1.x,那么您将无法访问Flowable类。这不是我的情况,但是下面的代码可以执行并行操作。有更多的嵌套,但它的工作

    final ExecutorService executor = Executors.newFixedThreadPool(2);
    List<String> iterableList = new ArrayList<>();
    iterableList.add("one");
    iterableList.add("two");
    iterableList.add("three");
    iterableList.add("4");
    iterableList.add("5");
    iterableList.add("6");
    iterableList.add("7");
    iterableList.add("8");
    iterableList.add("9");
    Observable.from(iterableList)
            .flatMap(val -> Observable.just(val)
                    .subscribeOn(Schedulers.from(executor))
                    .doOnNext(numString -> {
                        try {
                            System.out.println(1);
                            Thread.sleep(500);
                            System.out.println(2);
                        } catch (Exception ex) {
                        }
                    })
            )
            .subscribe();
final executor服务executor=Executors.newFixedThreadPool(2);
List iterableList=new ArrayList();
iterableList.添加(“一”);
iterableList.添加(“两个”);
添加(“三”);
iterableList.添加(“4”);
iterableList.添加(“5”);
iterableList.添加(“6”);
iterableList.添加(“7”);
iterableList.添加(“8”);
iterableList.添加(“9”);
可观察。从(iterableList)
.flatMap(val->Observable.just(val)
.subscribeOn(调度程序从(执行者))
.doOnNext(numString->{
试一试{
系统输出打印项次(1);
睡眠(500);
系统输出打印ln(2);
}捕获(例外情况除外){
}
})
)
.subscribe();

异步并不意味着无序。应用
Scheduler
s时,操作将在指定的
Scheduler
上执行,但结果仍然是一个具有顺序的流。这就成功了。我正在使用
doOnNext
doOnError
doOnComplete
来执行操作和记录。
1
1
1
... 
2
2
2
        Flowable.fromIterable(array)
                .parallel(3) // number of items in parallel
                .runOn(Schedulers.newThread()) // the desired scheduler
                .map(item -> {
                    try {
                        System.out.println(1);
                        Thread.sleep(3000);
                        System.out.println(2);
                    } catch (Exception e) {

                    }

                    return Completable.complete();
                })
        .sequential().subscribe();
    final ExecutorService executor = Executors.newFixedThreadPool(2);
    List<String> iterableList = new ArrayList<>();
    iterableList.add("one");
    iterableList.add("two");
    iterableList.add("three");
    iterableList.add("4");
    iterableList.add("5");
    iterableList.add("6");
    iterableList.add("7");
    iterableList.add("8");
    iterableList.add("9");
    Observable.from(iterableList)
            .flatMap(val -> Observable.just(val)
                    .subscribeOn(Schedulers.from(executor))
                    .doOnNext(numString -> {
                        try {
                            System.out.println(1);
                            Thread.sleep(500);
                            System.out.println(2);
                        } catch (Exception ex) {
                        }
                    })
            )
            .subscribe();