RxJava异步订阅

时间:2015-02-01 12:21:09

标签: java multithreading asynchronous system.reactive rx-java

我有一个应该在新线程中逐个处理的任务列表,然后结果应该通过某个主线程显示在方法中。 但是,这似乎不起作用,在主线程中调用flatMap方法。

为什么subscribeOn方法在这种情况下不处理“线程切换”?

在另一个线程中执行某些工作会有什么更好的模式? (除了使用Observable.create并手动创建新线程,这非常详细)

List<Task> tasks = ...;
Observable.from(tasks)
          .flatMap(task -> {
                // should be handled in a new thread
                try {
                    return Observable.just(task.call());
                } catch (Exception e) {
                    log.error("Error", e);
                }

                return Observable.empty();
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(MySchedulers.main())
            .subscribe(this::show); // subscribe called from main thread

1 个答案:

答案 0 :(得分:3)

警告:我不是Java程序员,而是C#,因此所有奇怪的驼峰案例方法名称都让我感到困惑并使我感到困惑。

如果您想要subscribeOn操作的新线程,flatMap位置错误。将其插入fromflatMap之间。有关subscribeOnobserveOn的完整说明,请参阅this answer - 它是为.NET编写的,但原则是相同的。

我不熟悉Java中的任务,所以我不确定您的Task是否像.NET Task以及task.call()是异步的并且启动它自己的线程 - 我想你的问题并不是因为你说的是​​......在 a 新线程中应该逐个处理的任务列表&#34;

newThread调度程序使用每个订阅者的新线程 - 由于flatMap将进行单个订阅,所有task.call调用都将在同一个线程上进行,虽然这将来自from运营商的主题。

如果task.call实际上是异步的,那么结果将根据它引入并发性而返回,并且它将独立于Rx的语义。

无论哪种方式,(正确放置)observeOn都会导致结果传递到主线程上的this::show