块()、订阅()和订阅(-)有什么不同 [英] What is the difference between block() , subscribe() and subscribe(-)

查看:11
本文介绍了块()、订阅()和订阅(-)有什么不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Mono.delay(Duration.ofMillis(10)).map(d -> {
            System.out.println(d);
            return d;
        }).block();

o输出:0

当我使用SUBSCRIBE()或SUBSCRIBE(-)方法而不是BLOCK()调用时,无法在控制台上看到任何输出

Mono.delay(Duration.ofMillis(10)).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

在此Mono.Delay(-)方法之后是否只需要使用doOnSubcribe(-)?

 Mono.delay(Duration.ofMillis(10)).doOnSubscribe(s -> {
        System.out.println("its printing doOnSubscribe");
    }).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

输出其打印doOnSubscribe

推荐答案

您的block()调用显式持有主线程,直到发布服务器完成。当它完成时,它将执行map()调用,因此打印值。

另一方面,您的subscribe()调用在单独的调度程序上异步执行Mono,让您的主线程完成。由于默认情况下使用的计划程序使用守护程序线程来执行您的订阅,因此您的程序不会等到它完成后才终止。

如果您引入的延迟足够长,Mono将完成,您将看到预期的结果:

Mono.delay(Duration.ofMillis(10)).map(d -> {
    System.out.println(d);
    return d;
}).subscribe(System.out::println);

Thread.currentThread().sleep(500);

0随后打印两次,一次用于map()调用,一次由用作使用者的System.out::println打印。

在真实的用例中,您显然不会只放入任意的sleep()调用--CountDownLatch将是更明智的选择:

CountDownLatch cdl = new CountDownLatch(1);
Mono.delay(Duration.ofMillis(10))
        .map(d -> {
            System.out.println(d);
            return d;
        })
        .doOnTerminate(() -> cdl.countDown())
        .subscribe(System.out::println);
cdl.await();

这篇关于块()、订阅()和订阅(-)有什么不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆