RxJava - 对工作线程执行多个操作并将结果合并为一个

时间:2015-06-22 19:30:24

标签: java multithreading reactive-programming rx-java

我想要做的是在工作线程上执行多个操作(比如网络请求),然后将每个请求的结果合并为一个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())

然后没有任何内容打印到控制台。我在这里做错了什么?

1 个答案:

答案 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(...);