块()、订阅()和订阅(-)有什么不同 [英] What is the difference between block() , subscribe() and subscribe(-)
本文介绍了块()、订阅()和订阅(-)有什么不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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屋!
查看全文