java - 使用Reactor作为任务执行器的正确方法

标签 java project-reactor

我正在看documentation一种使用 Reactor 作为任务执行器的方法。我想提交一些任务,并行化它,然后像 ThreadService 一样等待它终止,示例如下:

final ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(() -> {sleep(200);System.out.println(1);});
pool.submit(() -> System.out.println(2));
pool.submit(() -> System.out.println(3));
pool.submit(() -> System.out.println(4));
pool.submit(() -> System.out.println(5));
pool.submit(() -> System.out.println(6));
pool.submit(() -> System.out.println(7));
pool.submit(() -> System.out.println(8));
pool.submit(() -> System.out.println(9));
pool.submit(() -> System.out.println(10));

pool.awaitTermination(5, TimeUnit.SECONDS);
pool.shutdown();

我只是在将结果收集到列表时才得到这个

final List<Integer> result = Flux.range(1, 15)
    .parallel()
    .runOn(Schedulers.elastic())
    .map(n -> {
        // simulating heavy task
        sleep((long) (Math.random() * 100));
        return n;
    })
    .sequential()
    .collectList().block();
System.out.println(result);

有更好的方法吗?

最佳答案

首先请记住,您的阻塞map没问题,因为您在弹性Scheduler中运行它(可能是parallel() 也是)。

如果你不关心结果并且想要在终止时阻塞,你可以使用.blockLast()(它将返回最后计算的n,但你可以忽略它。

如果您想在链上进一步组合,例如启动另一个进程,您可以链接任何风格的 then,这将返回表示任务终止的 Mono (删除数据事件)。

关于java - 使用Reactor作为任务执行器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353526/

相关文章:

spring-boot - 结合非阻塞和阻塞调用并在 Spring Webflux 中返回结果

java - log4J 未写入 Spring Boot 微服务中的特定日志文件

java - 在链表中设置指向 null 的指针

rx-java - debounce、throttleFirst 和throttleLast 的 Flux 等效项是什么

json - 如何从 SpringBoot Controller 中的 Flux<String> 获取 JSON 格式?

spring - 立即返回 Spring 网通量

java - 有没有办法处理错误,使原始序列不会终止?

java - 使用 Jackson 反序列化可选多态字段

java - 如何排除 Java Web 服务故障?

java - 如何打印链表中的元素