Java 反应器3发射极/用户并联

Java 反应器3发射极/用户并联,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,我是反应式编程新手,有很多问题。 我认为这并不是缺少示例或文档,只是我的理解是错误的 我试图模仿慢用户 下面是代码示例 Flux.create(sink -> { int i = 0; while (true) { try { System.out.println("Sleep for " + MILLIS); Thread.sleep(MILLIS); int it = i++;

我是反应式编程新手,有很多问题。 我认为这并不是缺少示例或文档,只是我的理解是错误的

我试图模仿慢用户

下面是代码示例

Flux.create(sink -> {
    int i = 0;
    while (true) {
        try {
            System.out.println("Sleep for " + MILLIS);
            Thread.sleep(MILLIS);
            int it = i++;
            System.out.println("Back to work, iterator " + it);
            sink.next(it);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).subscribeOn(Schedulers.elastic())
.subscribe(x -> {
    try {
        System.out.println("Value: " + x + ", Thread: " + Thread.currentThread().toString());
        Thread.sleep(MILLIS + 4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});
系统输出是

Sleep for 1000
Back to work, iterator 0
Value: 0, Thread: Thread[elastic-2,5,main]
Sleep for 1000
Back to work, iterator 1
Value: 1, Thread: Thread[elastic-2,5,main]
Sleep for 1000
Back to work, iterator 2
Value: 2, Thread: Thread[elastic-2,5,main]
我想如果订阅服务器速度慢,我应该看到更多的线程,因为
Schedulers.elastic()

此外,我还尝试将
publishOn()
设置为异步,但仍然无法处理多个线程中的结果


感谢您的评论和回答。

如果您想让它在不同的线程中运行,您需要像这样使用.parallel(),并且emit将在不同的线程中运行

Flux.create(sink -> {
        int i = 0;
        while (true) {
            try {
                System.out.println("Sleep for " + MILLIS);
                Thread.sleep(100);
                int it = i++;
                System.out.println("Back to work, iterator " + it);
                sink.next("a");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    })

            .parallel()
            .runOn(Schedulers.elastic())

            .subscribe(x -> {
                try {
                    System.out.println("Value: " + x + ", Thread: " + Thread.currentThread().toString());
                    Thread.sleep(100 + 4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            })
    ;
}

如果你想模拟慢速订阅者,你应该做相反的事情,而不是延迟发射一个项目,你应该创建很多没有延迟的项目delay@pixel这是公平的,但如果我使用的是阻塞代码,例如从队列中读取,那会怎么样?这意味着您的发布服务器速度慢(发出的项目很少)订户只需等待事件。所以你不需要很多订户,但我想我明白了。但若订阅者比发射器慢呢?你们可以从代码中看到,它是一个阻塞代码,有一个工作线程。当订阅服务器比发送器慢时,你们可以利用背压。关于这一点有一篇很好的文章:但是,你的代码并没有反映这种情况:)这很有趣,但我完全不明白发生了什么:)在我的脑海中,我们应该看到一些东西,比如我们在一些磨坊中发射,并在并行线程中延迟消耗,所以我们应该首先发射几个值,然后消费。@VIQ您在弹性中订阅,但您应该知道您在流中只订阅了一次,并且流将在弹性池中找到一个空闲线程,因此所有流将在单个弹性线程中运行,因此您正在等待延迟。在我的例子中,我将分离新并行流中的每个元素,以在弹性池中获得新线程