我正在學習調度程式的作業原理。所以我試圖將數字設定為 100。使用 publishOn 可以作業(它將數字設定為 100),但是使用 subscribeOn 時它沒有將數字設定為 100。我不明白為什么?
@Test
fun reactor01_LearnSchedulers(){
var number = 0
Mono.just(100)
.doOnNext { numb -> number = numb }
// .subscribeOn(Schedulers.boundedElastic()) this gives result: 0
.publishOn(Schedulers.boundedElastic()) // this gives result: 100
.subscribe()
println("Result : $number")
}
更新:添加一些代碼后,我發現結果不一致。
fun reactor01_LearnSchedulers(){
var number = 0
Mono.just(100)
.doOnNext { numb -> number = numb }
.doOnNext { println("Result from inside: $number") }
.publishOn(Schedulers.boundedElastic())
.subscribe()
println("Result from outside: $number")
// with publishOn Result from inside: 100, Result from outside: 100
// with subscribeOn Result from outside: 0, Result from inside: 100
}
uj5u.com熱心網友回復:
這里的問題與時間和理解執行緒轉移在 Reactor 中的作業方式有關。
當您這樣做時subscribe(),您完全在具有該反應流定義的同一執行緒上或在您在subscribeOn().
這里publishOn()是獨立的,不會影響訂閱者的行為。
因此,當您有一個publishOn()但不是subscribeOn()時,subscribe()您仍然可以使流程在與整個測驗方法相同的執行緒中執行。在println()剛剛執行后subscribe(),整個流的評價。但是,當您添加時subscribeOn(),流程的訂閱和執行發生在該執行緒上,而主執行緒可以自由地繼續執行代碼中的下一條陳述句。因此,由于您處于異步情況,因此將number其設定為預期值并不幸運。
我建議您學習StepVerifier了解如何測驗所有這些 Reactor 流:https : //projectreactor.io/docs/core/release/reference/#testing
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383397.html
