我有以下代码片段,当我的writerObj的内部数据结构是CopyOnWriteArrayList(并发一个)时,它完美地工作,当我使用ArrayList时它会崩溃。
以下是我的问题:
我的代码如下:
.flatMapCompletable { player -> {
writerObj.write(player); // void write(Player player) adds player to inner data structure using ds.add()
return Completable.complete();
}
}
答案 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());
希望它有所帮助!