繁体   English   中英

RxJava Flowable 缓存到单个死锁

[英]RxJava Flowable cache to Single deadlock

下面是我的代码片段。

我知道你不应该像这样阻止cachedFlowable ,但这只是一个例子。

它卡在blockingGet线。

如果我用singleOrError替换singleElement ,代码仍然会卡住。 如果我用singleOrError替换firstElement ,代码将不再卡住。

有人可以向我解释为什么会这样吗?

    public static void main(String[] args) {
        final Flowable<Integer> cachedFlowable = Flowable.just(1).cache();
        cachedFlowable
                .doOnNext(i -> {
                    System.out.println("doOnNext " + i);
                    final Integer j = cachedFlowable.singleOrError().blockingGet();
                    System.out.println("after blockingGet " + j);
                })
                .blockingSubscribe();
    }

它与singleX运算符死锁的原因是此类运算符等待可能的第二个项目发射,但由于您阻止它们,因此无法执行来自主源的任何第二个项目或完成。 使用firstX ,他们只关心第一个项目,因此几乎立即解除阻塞,从而允许源完成。

所以是的,您不应该在这样的流程中使用阻塞方法,而是使用flatMapconcatMap来执行每个项目的子流程:

var cache = Flowable.just(1).cache();

cache
.doOnNext(i -> System.out.println("doOnNext " + i))
.concatMapSingle(item -> cache.firstOrError())
.doOnNext(j -> System.out.println("after " + j))
.blockingSubscribe();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM