为什么React流订阅服务器在当前线程中执行?

ngynwnxp  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(238)

subscribe 文件说明:
请记住,由于序列可以是异步的,这将立即将控制返回给调用线程。这会给人一种印象,例如在主线程或单元测试中执行时,使用者没有被调用。
为什么我看到所有的元素都打印出来了?这意味着lambda在主线程中执行

import reactor.core.publisher.Flux;

import java.util.concurrent.TimeUnit;

public class ReactorMain {

    public static void main(String[] args) {
        Flux.just(1,2,3,4,5,6,7,8,9,10)
                .limitRequest(5)
                .skip(3)
                .subscribe(value -> {
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Value: " + value);
                })
        ;
    }
}
l3zydbqr

l3zydbqr1#

这是因为生成的值不包含任何异步元素。因此,当您订阅flux时,它将使用当前线程来执行尽可能多的操作,直到异步元素让它等待并使用线程执行其他操作为止。
例如,如果要生成元素,您以异步方式调用web服务,您将以异步方式接收值。
您可以通过使序列延迟来测试它:

public static void main(String[] args) {
            Flux.just(1,2,3,4,5,6,7,8,9,10)
                    .limitRequest(5)
                    .skip(3)
                    .delayElements(Duration.ofSeconds(2))
                    .subscribe(value -> {
                        System.out.println("Value: " + value);
                    })
            ;
        }

相关问题