代码之家  ›  专栏  ›  技术社区  ›  Stav Alfi

了解缓冲区操作的工作原理

  •  1
  • Stav Alfi  · 技术社区  · 6 年前
    Flux.interval(Duration.ofMillis(100))
            .map(i -> 0)
            .buffer(Duration.ofMillis(200))
            .filter(list1 -> list1.size() != 2)
            .subscribe(System.out::println,
                          Throwable::printStackTrace, System.out::println);
    

    以上代码打印:(至少第一分钟): [0]

    为什么?我根本没想到会有任何印刷。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Oleh Dokuka    6 年前

    只有一份来自 .interval 运算符,即在每个指定的时间间隔上生成 onNext 将安排活动。

    不幸的是,无法保证计划的任务在提交后会及时执行。

    这是因为潜在的 Scheduler Flux.interval 换言之,是一个调度某个事件并在一段时间内重复它的操作符。这里的问题是,任何计划的操作都依赖于 Thread 在其上计划该操作。对于Reactor,它是一组线程,或者换句话说是ThreadPool(在Reactor世界中是 调度程序 )。这里的问题是,操作的执行可能会晚一点(但不是早一点),这是无法保证的,因为在线程的情况下,底层系统调度器可能会将执行时间分配给另一个线程或另一个如此专用的执行 线 将耗尽CPU周期,或者在线程池的情况下,有一个线程池的队列,反过来,有可能会有另一个更重要的任务更早执行。

    所有这一切都意味着时间间隔将推迟。反过来,这意味着缓冲区中可能有3个任务。所有这些 interval 保证间隔任务将按每个指定的间隔进行调度(在您的情况下是200 ms)