Java 默认情况下,Mono.fromCallable在调用线程上执行?

Java 默认情况下,Mono.fromCallable在调用线程上执行?,java,project-reactor,Java,Project Reactor,我试图使用ProjectReactor的Mono.fromCallable(Callable)执行一个异步操作,我注意到,在我的测试用例中,它似乎在调用线程上运行。是否有文档记录了Mono.fromCallable(Callable)默认使用调用线程 我从中看到,我应该做如下事情: Mono blockingWrapper=Mono.fromCallable(()->{ return/*进行远程同步调用*/ }); blockingWrapper=blockingWrapper.subscrib

我试图使用ProjectReactor的
Mono.fromCallable(Callable)
执行一个异步操作,我注意到,在我的测试用例中,它似乎在调用线程上运行。是否有文档记录了
Mono.fromCallable(Callable)
默认使用调用线程

我从中看到,我应该做如下事情:

Mono blockingWrapper=Mono.fromCallable(()->{
return/*进行远程同步调用*/
});
blockingWrapper=blockingWrapper.subscribeOn(Schedulers.boundedElastic());
但是我看不到任何地方默认使用了
Schedulers.immediate()
。为什么不默认为Schedulers.boundedElastic()?

反应堆用户指南的这一部分与您的问题相关(重点是我的问题):

获取
通量
单声道
并不一定意味着它在专用线程中运行。相反,大多数操作符继续在前一个操作符执行的线程中工作除非指定,否则最顶端的操作符(源)本身在执行
subscribe()
调用的线程上运行。

.subscribeOn(…)
操作符将导致在指定的计划程序上调用上游的
可调用的
,而不是调用
subscribe()
的线程


默认情况下,传递给
.fromCallable
Callable
不会在另一个计划程序上运行,因为所有
Callable
都不一定阻塞。因此,在很多情况下,没有理由在另一个调度程序上执行
Callable

默认情况下,在调用线程(main)上执行的不仅仅是
fromCallable
,而是反应堆管道。只有几个操作符(如delay)改变了这一点:另外,弹性线程池不是反应式编程的最佳fir,因此应尽可能避免。还需要注意的是,您使用Mono.fromCallable包装阻塞调用,但这不是它的唯一用例,所以总是在弹性线程池上执行它是不公平的。