首页 > 解决方案 > futures.forEach(CompletableFuture::join) 并行运行所有任务?

问题描述

我有多个可完成的期货创建为:

CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> xxx);
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> xxx);
List<CompletableFuture<Void>> futures = Lists.newArrayList(future1, future2);

当我在下面运行时,这两个未来的任务是并行运行的吗?一个future抛出的异常会阻塞另一个future吗?

futures.forEach(CompletableFuture::join);

标签: javamultithreadingcompletable-future

解决方案


通过调用CompletableFuture.runAsync(...)将任务提交给共同ForkJoinPool的。此池由 JVM 管理。

由于它是一个公共池,因此无法保证/不能保证任务实际上是并发运行还是并行运行(其他任务可能会提交到池中,或者池可能只有一个线程可供使用,从而导致任务的顺序执行)。但在最好的情况下,它们将被并行处理。

一项Exception任务不会对另一项任务产生任何影响(除非在任务中明确实施)。事实上,如果没有进一步的配置,Exception将被默默地忽略(为了捕获Exceptions,可以在构造 a 时设置显式UncaughtExceptionHandlerForkJoinPool)。还可以通过调用(以了解任务是否已执行)和(以了解任务是否已完成ComletableFuture)来确定 a 是否已通过 a 完成。本身可以通过调用来获得,但要注意调用时会抛出,而不是返回ExceptionisDone()isCompletedExceptionally()ExceptionExceptionget()Exceptionget()


推荐阅读