如何从void方法返回Completable

时间:2018-01-17 11:27:24

标签: java rx-java reactive-programming

我有以下代码片段,当我的writerObj的内部数据结构是CopyOnWriteArrayList(并发一个)时,它完美地工作,当我使用ArrayList时它会崩溃。

以下是我的问题:

  • 但默认情况下RxJava中只有一个线程,不是吗?
  • 线条(玩家{...}之间)是否同步执行?

我的代码如下:

.flatMapCompletable { player -> {
    writerObj.write(player); // void write(Player player) adds player to inner data structure using ds.add()
    return Completable.complete();
    }
}

1 个答案:

答案 0 :(得分:1)

取决于链的其余部分是如何编码的。

看看以下内容:

List<String> writerObj = new ArrayList<>();

Observable.range(0, 1000)
        .map(i -> Observable.just("hello world"))
        .flatMap(obs -> obs
                .flatMapCompletable(elem -> {
                        writerObj.add(elem);
                        System.out.println(Thread.currentThread().getName()  + " executing");
                        return Completable.complete();
                })
                .toObservable()
                .subscribeOn(Schedulers.io())
        )
        .blockingSubscribe();
//Size of the list is not always 1000
System.out.println("The size of the list is : " + writerObj.size());

如果执行上面的代码,您可能会注意到最后List的大小并不总是1000.如果将List的实现更改为CopyOnWriteArrayList,我们将得到所需的结果。

如果您希望flatMap中的代码按顺序一次执行,请将flatMap更改为concatMap。

List<String> writerObj = new ArrayList<>();

Observable.range(0, 1000)
    .map(i -> Observable.just("hello world"))
    .concatMap(obs -> obs
            .flatMapCompletable(elem -> {
                    writerObj.add(elem);
                    System.out.println(Thread.currentThread().getName()  + " executing");
                    return Completable.complete();
            })
            .toObservable()
            .subscribeOn(Schedulers.io())
    )
    .blockingSubscribe();
// Size is always 1000
System.out.println("The size of the list is : " + writerObj.size());

希望它有所帮助!