1

我想要做的是拥有一个带有背压缓冲区的 Flowable,该缓冲区保留从流中生成的最新项目。

我尝试使用 Flowable.onBackpressureBuffer(1, () -> {}, BackpressureOverflowStrategy.DROP_OLDEST)。但是,它并没有像我预期的那样工作

  Flowable.range(0, 10_000)
      .onBackpressureBuffer(1, {}, BackpressureOverflowStrategy.DROP_OLDEST)
      .observeOn(Schedulers.computation())
      .subscribe {
        println(it)
        Thread.sleep(5)
      }

我期望的输出是一个整数序列,不一定是连续的,应该包括最后一项 9,999。但是,它只打印前几个连续的数字,例如 0、1、2、3、4...,每次都不同,但不是最后一个数字 9,999。

4

1 回答 1

1

我正在使用下面的代码,它最后总是打印 9999。它首先打印连续的数字(直到 127),然后打印 9999。在您的情况下,主执行线程可能比处理打印数字的线程结束得早得多。为了打印直到 9999 的所有数字,我尝试将背压缓冲区更改为 10000(并且主线程睡眠到更高的值),这显然确保了所有数字都被打印,因为缓冲区非常大。

public class FlowableTest {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub

        Flowable.range(0, 10_000).onBackpressureBuffer(1, () -> {
        }, BackpressureOverflowStrategy.DROP_OLDEST).observeOn(Schedulers.computation()).subscribe(it -> {
            System.out.println(it);
            Thread.sleep(5);
        });

        Thread.sleep(50000); // wait the main program sufficient time to let the other threads end

    }
于 2019-08-16T19:22:41.853 回答