java - 响应式(Reactive)编程(Reactor): Why main thread is stuck?

标签 java reactive-programming project-reactor

我正在学习使用项目 react 器进行响应式编程。

我有以下测试用例:

@Test
public void createAFlux_just() {
    Flux<String> fruitFlux = Flux.just("apple", "orange");
    fruitFlux.subscribe(f -> {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(f);
    });
    System.out.println("hello main thread");
}

通过执行测试,主线程似乎卡住了5秒。

我希望订阅的消费者应该在自己的线程中异步运行,也就是说,订阅调用应该立即返回到主线程,因此hello主线程应该立即打印。

最佳答案

主线程被卡住,因为订阅发生在main上线。如果您希望它异步运行,则需要在 main 以外的线程上进行订阅。 。您可以这样做:

 @Test
public void createAFlux_just() {
    Flux<String> fruitFlux = Flux.just("apple", "orange");
    fruitFlux.subscribeOn(Schedulers.parallel()).subscribe(f -> {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(f);
    });
    System.out.println("hello main thread");
}

注意:我使用了parallel线程池。您可以使用任何您喜欢的游泳池。 Reactor 的管道默认在调用线程上执行(与默认在 CompletableFuture<T> 池中运行的 ForkJoin 不同)。

关于java - 响应式(Reactive)编程(Reactor): Why main thread is stuck?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64097135/

相关文章:

javascript - 为什么当 react 变量改变值时这个函数不运行?

java - 使用 react 器提供静态内容

java - 如何在 glassfish 3.1.2 服务器中获取 Java 的空闲请求线程数?

java - 地点详细信息请求失败 - 引用太长

java - 无法编译 Parquet 工具

JavaFX 和 RxJava-TableView 无限调用 setCellValueFactory()

java - 我只收到文本和图像 : Wordpress REST API app in Android studio

java - Mono/Flux 可以重用/它们是不可变的+无状态的吗?

java - react 堆重试不调用要重试的方法

spring - Spring Reactor 丢失消息