首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用delayElements时,程序在Flux完成之前终止

当使用delayElements时,程序在Flux完成之前终止
EN

Stack Overflow用户
提问于 2022-08-25 22:34:36
回答 2查看 44关注 0票数 0

我正在学习反应性编程,但我有一个疑问,我正在尝试执行以下代码,但我不明白为什么在订阅之前添加delayElements,没有打印元素

如果没有delayElements,则会显示值

代码语言:javascript
运行
复制
import reactor.core.publisher.Flux;

import java.time.Duration;

public class PlayWithFlux {

    public static void main(String[] args){
        Flux<Integer> flux = Flux.just(1, 2, 3);
        flux.log().subscribe(System.out::println);
    }
}

使用delayElements时,不会显示元素

代码语言:javascript
运行
复制
import reactor.core.publisher.Flux;

import java.time.Duration;

public class PlayWithFlux {

    public static void main(String[] args){
        Flux<Integer> flux = Flux.just(1, 2, 3).delayElements(Duration.ofSeconds(1));
        flux.log().subscribe(System.out::println);
    }
}

对这种行为有什么解释吗?

EN

回答 2

Stack Overflow用户

发布于 2022-08-26 15:26:29

这里的问题是delayElements按它说的做,它在发射元素之前会延迟。

调用subscribe不是阻塞事件,而是异步或“触发并忘记”操作符。

因此,实际上正在发生的是调用subscribe,然后主流继续并结束程序,然后才有时间发出任何值。

要快速解决这个问题,只需延迟程序的结束,例如调用Thread.sleep()

代码语言:javascript
运行
复制
public static void main(String[] args){
    Flux.just(1, 2, 3)
        .delayElements(Duration.ofSeconds(1))
        .subscribe(System.out::println);

    // Delay program shutdown so we can watch the elements get printed
    Thread.sleep(5000);
}
票数 0
EN

Stack Overflow用户

发布于 2022-08-27 09:44:14

如果您只使用Flux.justsubscribe,那么一切都在主线程上执行,所以程序只有在Flux完成后才会终止。

一旦delayElements进入图片,Flux就不再在主线程上执行。在内部,delayElements切换到一个所谓的并行调度程序,它基本上是一个线程池.由于现在Flux运行在不同的线程上,主线程将继续执行,而无需等待Flux完成,程序将在Flux完成之前终止。

与其使用Thread.sleep,不如在本例中使用block...方法之一。这样,程序就可以在Flux完成后立即完成:

代码语言:javascript
运行
复制
public static void main(String[] args){
    Flux.just(1, 2, 3)
        .delayElements(Duration.ofSeconds(1))
        .doOnNext(System.out::println)
        .blockLast();
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73494306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档