如果我将阻塞代码封装到flatMap中,这仍然是非阻塞操作吗?
示例:
public Mono<String> foo() {
Mono.empty().flatMap(obj -> {
try {
Object temp = f.get();//are the thread at this point blocked or not ?
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return Mono.just("test");
});
所以,我认为当我将阻塞代码包装成反应代码时,操作仍然是非阻塞的?如果我错了,请向我解释。
答案 0 :(得分:1)
如果我将阻塞代码封装到flatMap中,这仍然是非阻塞操作吗?
flatMap不会为您创建新主题。例如:
Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribe();
上面的所有代码都将由调用subscribe
的当前线程执行。因此,如果映射器函数包含长阻塞操作,则调用subscribe的线程也将被阻塞。
要将其转换为异步操作,您可以使用subscribeOn(Schedulers.elastic());
Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribeOn(Schedulers.elastic());
Mono和Flux不会创建线程,但是有些运营商会将Scheduler
作为额外参数使用,例如interval
运算符,或者更改线程模型,例如{{1 }}
另外一件事,在你的例子中,mapper函数永远不会被调用,因为你将flatMap应用到一个空的单声道,它直接完成而没有发出任何值。