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您在弹性中订阅,但您应该知道您在流中只订阅了一次,并且流将在弹性池中找到一个空闲线程,因此所有流将在单个弹性线程中运行,因此您正在等待延迟。在我的例子中,我将分离新并行流中的每个元素,以在弹性池中获得新线程