RxJava のバックプレッシャーに関するいくつかのドキュメントを読んでいますが、ライブラリの内部でどのように発生するかなどの詳細な説明を見つけることができません。「プロデューサー」は速すぎ、「コンシューマー」は遅すぎます。
たとえば、以下のコードのように:
Observable.interval(1, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.newThread())
.subscribe(
i -> {
System.out.println(i);
try {
Thread.sleep(100);
} catch (Exception e) { }
},
System.out::println);
私は RxJava ソースコードを調べてきたので、私の理解では、メインスレッドではミリ秒ごとにイベントを発行し、発行したら System.out.println(i) メソッドに値を渡し、それをnewThead スケジューラのスレッド プールを開き、ランナブル内でメソッドを実行します。
だから私の質問は、どのように例外が内部的に発生するのですか? Thread.sleep() を呼び出すと、メソッド呼び出しを処理するスレッドをスリープ状態にするだけです -> System.out.println() スレッド プール内の他のスレッドに影響を与えることなく、例外が発生します。スレッドプールに使用可能なスレッドが十分にないためですか?
ありがとう