- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的这个测试基于 4.5.2. The subscribeOn Method (忽略缺少的 new Thread(...)
部分):
@Test
public void theSubscribeOnMethod() throws InterruptedException {
Scheduler s = Schedulers.newParallel("parallel-scheduler", 4);
final Flux<String> flux = Flux
.range(1, 2)
.map(i -> 10 + i)
.subscribeOn(s)
.doOnSubscribe(sub -> System.out.println(
"[doOnSubscribe] " + Thread.currentThread().getName()))
.map(i -> Thread.currentThread().getName() + ", value " + i);
flux.subscribe(System.out::println);
Thread.sleep(1000);
}
main
线程
[doOnSubscribe]
):
[doOnSubscribe] main
parallel-scheduler-1, value 11
parallel-scheduler-1, value 12
subscribeOn
后
doOnSubscribe
产生这个结果(从我的角度来看是正确的):
[doOnSubscribe] parallel-scheduler-1
parallel-scheduler-1, value 11
parallel-scheduler-1, value 12
Run subscribe, onSubscribe and request on a specified Scheduler's Scheduler.Worker. As such, placing this operator anywhere in the chain will also impact the execution context of onNext/onError/onComplete signals from the beginning of the chain up to the next occurrence of a publishOn.
doOnSubscribe
发生在
parallel-scheduler
线程而不是
main
尽管我放的地方
subscribeOn
.
reactor-core:3.1.0-RELEASE
最佳答案
这不是一个错误。这是预期的行为。这是事件的顺序,乍一看可能会令人困惑。
我稍微修改了你的例子:
Scheduler s = Schedulers.newParallel("parallel-scheduler", 4);
final Flux<String> flux = Flux
.range(1, 2)
.map(i -> 10 + i)
.subscribeOn(s)
.doOnNext(value -> System.out.println(
"[doOnNext] " + Thread.currentThread().getName() + " value: " + value))
.doOnSubscribe(sub -> System.out.println(
"[doOnSubscribe] " + Thread.currentThread().getName()));
flux.subscribe();
Thread.sleep(1000);
[doOnSubscribe] main
[doOnNext] parallel-scheduler-1 value: 11
[doOnNext] parallel-scheduler-1 value: 12
doOnSubscribe
实际上在管道中的其他任何东西之前运行。运营商首先收到有关订阅的通知,然后将订阅转发给其上游运营商,后者将其转发给其上游,依此类推……
flux.subscribe()
订阅管道并触发主线程上的执行 doOnSubscribe
获取有关订阅的通知并在主线程上触发提供的使用者,然后将订阅转发到其上游 doOnNext
收到有关订阅的通知,但它只对 onNext
感兴趣事件,因此除了将订阅转发到其上游(在主线程上)之外,它还没有做任何事情(!)subscribeOn(s)
- 上下文切换发生,此后的每个事件都在提供的调度程序的上下文中发生 map
然后 range
, 都在平行线程 range
是源,所以它发出第一项:onNext(1)
平行线程 map
在 onNext
上触发事件,进行转换并将转换后的元素作为 onNext
发送并行线程上的事件 subscribeOn
除了转发 onNext
之外什么都不做 Activity doOnNext
消费者被触发,因为它收到了 onNext
事件,仍在并行线程上 doOnSubscribe
忽略 onNext
事件,只是将事件转发给下一个运算符(operator) onNext(2)
重复了 6-10 个事件项目 doOnSubscribe
和
susbcribeOn
在此传播过程中按此顺序触发),之后实际数据从顶部源操作符(
range
)反向流动) 至底部。
doOnSubscribe
之前运行
susbcribeOn
,它仍然会在主线程上运行。
关于java - 为什么 subscribeOn 方法不切换上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59553733/
任何人都可以看一下下面的代码并让我知道为什么它的行为不同: package com.example.rxjava; import rx.Observable; import rx.functions.
我正在自学响应式编程,方法是解决随机问题并毫不羞愧地问愚蠢的新手问题。在弄清楚线程调度的工作原理时,我设法难住了自己。虽然我很确定这段代码没有逻辑意义,但我也无法理解发生了什么。弄清楚这一点可能会帮助
我将 RxJava2 与 Room SQLite 结合使用。我的道: @Dao public interface HeroDao { @Insert long create(Hero
我是 RxJava 的新手,我正在尝试使用 RxJava 进行 Retrofit 调用。当我在 SubscribeOn 上编写这段代码时,它说“无法解析方法 SubscribeOn(io.reacti
我的这个测试基于 4.5.2. The subscribeOn Method (忽略缺少的 new Thread(...) 部分): @Test public void theSubs
为什么subscribe在这里从不打印任何内容?只是出于好奇。无论如何,这是一个坏习惯,我会改用observeOn,但是我无法弄清楚为什么从来没有达到subscribe ... fun main()
嗨,我有一个简单的问题,假设我有一个如下所示的类(class): import lombok.Value; import java.nio.file.Path; @Value class ImageR
我正在将 AsyncTaskLoader 迁移到 RxJava,试图了解有关 RxJava 并发方法的所有细节。简单的事情运行正常,但是我在处理以下代码时遇到了困难: 这是执行的顶级方法: mComp
我想知道当我们在 RxJava 链中有多个 subscribeOn() 方法时会发生什么。例如,如果我有一个像这样的链, Single.fromCallable { repository.ap
我想知道在 Subject 上调用 subscribeOn() 会产生什么后果。 我知道(默认情况下)这不会改变发射的线程项目,我只是好奇它是否会导致其他一些负面影响。 一般来说,从不同的线程调用同一
我刚刚发现了 SubscribeOn,这让我想知道我是否应该使用它而不是 ObserveOn。谷歌带了我here和 here ,但两者都没有帮助我理解差异:它看起来非常微妙。 (在我的上下文中,我在非
我在使用 RxJava concat 运算符时遇到问题。我有两个可观察对象,第一个从服务器数据库发出结果,另一个从本地数据库发出结果,然后我连接: // Uses a Realm in the UI
基于阅读这个问题:What's the difference between SubscribeOn and ObserveOnObserveOn 设置代码在 Subscribe 处理程序中的位置被执
在强制执行 Observable.create 的某部分时代码在特定线程(即后台线程)中运行,我担心使用 subscribeOn运算符可能不起作用,因为有时我可能会将此可观察序列链接到另一个在主线程上
我对在可观察对象上调用 subscribeOn 和 observeOn 方法的顺序有点困惑。我读了几篇文章,一个人说没关系,只是在他的例子中使用了东西,其他人说这很重要。所以这是我的问题: 例如: s
Scheduling and Threading Intro to Rx 部分说 the use of SubscribeOn and ObserveOn should only be invoked
也许我只是真正了解 subscribeOn 和 observeOn 的内部工作原理,但我最近遇到了一些非常奇怪的事情。我的印象是,subscribeOn 决定了调度程序最初开始处理的位置(特别是当我们
我正在尝试使用 Retrofit 和 RxJava 从 api 获取列表并显示在 recyclerview 中。 我使用了下面的代码- ApiInterface apiService =
我在普通的 JDK 8 上。我有这个简单的 RxJava 示例: Observable .from(Arrays.asList("one", "two", "three")) .doOnNext(wo
我遇到了一个问题,我的可观察对象在 IO 线程上订阅并在 android 主 (UI) 线程上观察,但 doFinally 运算符在 IO 线程上运行,它需要在 UI 线程上运行。 用例几乎和这个me
我是一名优秀的程序员,十分优秀!