说我有一个方法,该方法带有一个参数并返回一个异步完成的Mono<Integer>
。例如:
Random random = new Random();
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(16);
Mono<Integer> fetch(String a) {
return Mono.create(em -> {
scheduledExecutorService.schedule(() -> em.next(a + " result"),
10 + random.nextInt(50), TimeUnit.MILLISECONDS);
});
}
说我有一个Flux<String>
,我可以将其添加到上面的fetch
方法中,并且可以包含很多元素。
是否可以确保并行调用该方法,但是将并发调用的数量限制为预定义的数量?
例如在上面的示例中为4,而我有16个可用线程-因此从这个角度来看,我总是保留12个备用线程。
答案 0 :(得分:2)
假设“馈入”,则表示您正在使用flux.flatMap(this::fetch)
,
那么您可以改为调用flux.flatMap(this::fetch, 4)
来设置flatMap并发。
此外,您的代码有两个编译错误:
Mono<Integer>
的返回类型与您提供给接收器的项目类型(a + " result"
)不匹配。我认为您是说Mono<String>
.next
方法。我认为您是说.success
给出所有这些,下面是一个示例:
private Flux<String> fetchAll() {
return Flux.range(0, 50)
.map(i -> Integer.toString(i))
.flatMap(this::fetch, 4);
}
private Mono<String> fetch(String a) {
return Mono.create(em ->
scheduledExecutorService.schedule(() -> em.success(a + " result"),
10 + random.nextInt(50), TimeUnit.MILLISECONDS)
);
}