术语“不可知的并发”到底是什么意思?

问题描述 投票:0回答:1

我试图理解Java反应式库,并通过关键字“ concurrency-agnostic” here来访问。有人可以提供一个小的工作示例来更好地理解这一点吗?

这是否意味着开发人员必须确保其代码可以正常工作并实现并发性?

p.s:对并发/并行应用程序非常新

java multithreading reactive-programming project-reactor
1个回答
1
投票

这就是医生说的:

...它不强制执行并发模型。相反,它让你 开发人员,在命令中。但是,这不会阻止该库 帮助您并发。

获得助焊剂或单声道不一定表示它在 专用线程。相反,大多数运营商会继续在 在其上执行前一个运算符的线程

让我们看几个例子:

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线程)。它们使用其他线程池并行运行。

© www.soinside.com 2019 - 2024. All rights reserved.