Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava内部如何产生背压_Java_Multithreading_Rx Java_Backpressure - Fatal编程技术网

RxJava内部如何产生背压

RxJava内部如何产生背压,java,multithreading,rx-java,backpressure,Java,Multithreading,Rx Java,Backpressure,我读了一些RxJava中的背压文档,但是我在库中找不到详细的解释,比如它是如何在内部发生的,每个人都只是总结说“生产者”太快,“消费者”太慢 例如,如下面的代码: Observable.interval(1, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .subscribe( i -> { System.out.println(i); tr

我读了一些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)方法,并将其扔进Newhead调度器的线程池,然后在可运行的线程中运行该方法

所以我的问题是,异常是如何在内部发生的?因为当我们调用Thread.sleep()时,我们只是在休眠处理方法调用->System.out.println()的线程,而不影响线程池中的其他线程,为什么会导致异常。是因为线程池没有足够的可用线程了吗


多亏了你可以把背压想象成一个允许一个操作员向其上游源头提供的系统:你可以给我128个元素。稍晚一点,这个操作员可能会说“好的,再给我96个”,所以总共可能有224个未完成的许可证。一些源,例如
interval
不关心许可证,只是定期分发值。由于许可证的数量通常与队列或缓冲区中的可用容量密切相关,因此分发超过这些存储容量的许可证可以容纳收益率
MissingBackpressureException

检测背压违规主要发生在对有界队列的
报价
返回false时,例如
observeOn
中指示队列已满的报价

检测违规行为的第二种方法是跟踪操作员中未完成的许可证计数,例如
onBackpressureDrop
,每当上游发送的数量超过此数量时,操作员就不会转发:

// in onBackpressureDrop
public void onNext(T value) {
    if (emitted != availablePermits) {
        emitted++;
        child.onNext(value);
    } else {
        // ignoring this value
    }
}
子订户通过request()发出许可信号,这通常会导致
onBackpressureDrop
中出现类似的情况:

public void childRequested(long n) {
    availablePermits += n;
}

实际上,由于可能的异步执行,
availablePermits
是一个
AtomicLong
(称为
requested
)。

您是说RxJava中的一些运算符将onNext()事件放入队列或缓冲区数据结构中,对吗?因此,异常不是由线程池引起的;)?