我试图理解Java反应式库,并通过关键字“ concurrency-agnostic” here来访问。有人可以提供一个小的工作示例来更好地理解这一点吗?
这是否意味着开发人员必须确保其代码可以正常工作并实现并发性?
p.s:对并发/并行应用程序非常新
这就是医生说的:
...它不强制执行并发模型。相反,它让你 开发人员,在命令中。但是,这不会阻止该库 帮助您并发。
获得助焊剂或单声道不一定表示它在 专用线程。相反,大多数运营商会继续在 在其上执行前一个运算符的线程
让我们看几个例子:
1)非并行/并行执行。默认情况下,Project Reactor不强制并发。这就是为什么以下Mono在预订的同一线程(主线程)上运行的原因:
Logger logger = LoggerFactory.getLogger(MyApplication.class);
Mono<String> helloMono = Mono.defer(() -> Mono.just("Hello!"))
.doOnNext(logger::info);
helloMono.subscribe();
日志:
22:06:15.235 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
22:06:19.841 [main] INFO MyApplication - Hello!
2)并行执行。我们可以使Mono在不同的线程上执行,并使用subscribeOn()
操作来增强并行性。注意Mono在elastic-2
线程上的运行方式,我们需要使用CountDownLatch强制程序等待:
Logger logger = LoggerFactory.getLogger(MyApplication.class);
Mono<String> helloMono = Mono.defer(() -> Mono.just("Hello!"))
.doOnNext(logger::info)
.doOnTerminate(latch::countDown)
.subscribeOn(Schedulers.elastic());
helloMono.subscribe();
latch.await();
日志:
22:11:26.704 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
22:11:26.733 [elastic-2] INFO MyApplication - Hello!
诸如WebFlux之类的框架使用类似于第二种方案的方法,在第二种方案中,I / O操作释放了调用线程(http线程)。它们使用其他线程池并行运行。