我想知道如何使用RxJava同时处理文本行。现在,我所拥有的是来自条目集的可观察对象,以及每个条目上的订阅者处理onNext调用中的条目。订阅者用这行代码订阅了observable
obs.observeOn(Schedulers.io()).subscribe(sub);
但是当我运行它时,它的运行速度与顺序版本一样慢,并且似乎是按顺序处理它。我该怎么做这个并发?
答案 0 :(得分:3)
您的observeOn(Schedulers.io())
电话意味着将在该一个线程上观察所有排放。您希望将它们放到自己的线程上。
在这里,我使用flatMap
为从源发出的每个项目创建一个新的observable。在映射函数内部,我必须defer
处理工作直到订阅,否则整个链在处理完成时被阻止。我还必须确保通过subscribeOn
在新线程上进行订阅。
Random r = new Random();
Observable.from(new String[]{"First", "Second", "Third", "Fourth", "Fifth"})
.flatMap(new Func1<String, Observable<String>>() {
public Observable<String> call(final String s) {
return Observable.defer(new Func0<Observable<String>>() {
public Observable<String> call() {
Thread.sleep(r.nextInt(1000));
return Observable.just(s);
}
}).subscribeOn(Schedulers.newThread());
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println("Observed " + s + " on thread " + Thread.currentThread().getId());
}
});
这给了我输出(注意无序和不同的线程 - 即并行处理):
Observed Fourth on thread 17
Observed Second on thread 15
Observed Fifth on thread 18
Observed First on thread 14
Observed Third on thread 16