使用Reactor作为任务执行程序的正确方法

时间:2017-11-17 14:57:37

标签: 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);

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

首先请注意,您的屏蔽map只有 ,因为您使用弹性Scheduler运行它(可能也是parallel()

如果你不关心结果并希望阻止终止,你可以使用.blockLast()(它将返回最后计算的n,但你可以忽略它。 / p>

如果你想在链上进一步构图,比如开始另一个过程,你可以链接then的任何风格,它将返回代表任务终止的Mono(删除数据事件)