gpt4 book ai didi

java - RxJava Flowable 缓存到单一死锁

转载 作者:行者123 更新时间:2023-11-30 01:44:55 25 4
gpt4 key购买 nike

下面是我的代码片段。

我知道您不应该像这样阻止 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();

关于java - RxJava Flowable 缓存到单一死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com