block() 、 subscribe() 和 subscribe(-) 之间有什么区别
What is the difference between block() , subscribe() and subscribe(-)
Mono.delay(Duration.ofMillis(10)).map(d -> {
System.out.println(d);
return d;
}).block();
输出 : 0
当我使用 subscribe() 或 subscribe(-) 方法而不是 block() 调用时,无法在控制台上看到任何输出
Mono.delay(Duration.ofMillis(10)).map(d -> {
System.out.println(d);
return d;
}).subscribe(System.out::println);
我们需要在这个 Mono.delay(-) 方法之后只使用 doOnSubscribe(-) 吗?
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);
output 其打印 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();
Mono.delay(Duration.ofMillis(10)).map(d -> {
System.out.println(d);
return d;
}).block();
输出 : 0
当我使用 subscribe() 或 subscribe(-) 方法而不是 block() 调用时,无法在控制台上看到任何输出
Mono.delay(Duration.ofMillis(10)).map(d -> {
System.out.println(d);
return d;
}).subscribe(System.out::println);
我们需要在这个 Mono.delay(-) 方法之后只使用 doOnSubscribe(-) 吗?
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);
output 其打印 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();