我想要做的是在工作线程上执行多个操作(比如网络请求),然后将每个请求的结果合并为一个List<>
。
我的代码的简化版本如下所示:
public static void main(String[] args) {
Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
.flatMap(integer -> {
try {
System.out.println(Thread.currentThread().getName());
//Simulate long-running operation
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return Observable.just("number: " + integer);
})
.toList()
.subscribe(new Subscriber<List<String>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<String> result) {
System.out.println(result);
}
});
}
现在运行正常,但显然它是在main
线程上执行的。当我在.toList()
之前添加此行时:
.subscribeOn(Schedulers.io())
然后没有任何内容打印到控制台。我在这里做错了什么?
答案 0 :(得分:1)
在io线程(守护程序线程)有机会运行之前,您的主线程会退出。因此,您可以使用.toBlocking().forEach()
等待异步计算,也可以在Thread.sleep(10000)
调用后添加subscribe()
。
修改强>: 原始示例本质上是顺序的。您可以通过在flatMap中推迟计算来引入一些并行性:
Observable.range(1, 10)
.flatMap(number ->
Observable.defer(() -> {
try {
// computation
return Observable.just("result: " + number);
} catch (Throwable e) {
return Observable.<String>error(e);
}
}).subscribeOn(Schedulers.computation());
)
.toList()
.subscribe(...);