我正在查看示例并阅读文档,并且在尝试以并行方式订阅Flux时发现了一些问题。
我有3个功能,如下所示。
private val log = LoggerFactory.getLogger("main")
private val sequence = Flux.just(1, 2)
fun a() {
sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
sequence.subscribe { log.info(">>> {}", it) }
}
fun b() {
sequence.subscribe { log.info(">>> {}", it) }
}
fun c() {
sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
}
现在,当我分别运行每种方法时,函数a()
和b()
的输出正确,但是c()
的输出为空。这是可以预期的,是设计使然吗?如果是这样,为什么会这样?
答案 0 :(得分:2)
Flux.just(...)
捕获值,因此经过优化,可以在订阅Thread
中立即执行。
使用subscribeOn
时,您可以将订阅Thread
的内容从main
更改为其他内容,从而使just
真正是异步的。
在a()
中,如果没有subscribeOn
,则第二个just
会阻塞主线程,以至于在异步替代方法完成之前测试不会完成。
在c()
中,main
线程没有这种阻塞。结果,测试在异步just
有时间发出任何东西之前终止,这就是为什么看不到输出的原因。
要使其更加可见,请添加一个Thread.sleep(10)
,您将看到一些输出。