我创建了多个可完成的 future :
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> xxx);
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> xxx);
List<CompletableFuture<Void>> futures = Lists.newArrayList(future1, future2);
当我在下面运行时,这两个 future 任务是否并行运行?一个 future 抛出的异常会阻塞另一个 future 吗?
futures.forEach(CompletableFuture::join);
最佳答案
调用CompletableFuture.runAsync(...)
任务提交至common ForkJoinPool
。该池由 JVM 管理。
由于它是一个公共(public)池,因此无法保证任务实际上是否并发或并行运行(其他任务可能会提交到池中,或者池可能会只有一个线程可供使用,导致任务顺序执行)。但在最好的情况下,它们将被并行处理。
一个任务中的异常
不会对另一任务产生任何影响(除非在任务中明确实现)。事实上,如果没有进一步配置,Exception
将被静默忽略(以捕获 Exception
,即 explicit UncaughtExceptionHandler
can be set when constructing a ForkJoinPool
)。我们还可以通过调用 isDone()
来确定 ComletableFuture
是否已完成并出现 Exception
。 (了解任务是否已执行)和 isCompletedExceptionally()
(了解任务是否已完成并出现异常
)。 Exception
本身可以通过调用 get()
来获取,但应该注意的是,在调用 get()
时,Exception
是抛出的,而不是返回。
关于java - futures.forEach(CompletableFuture::join) 并行运行所有任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383895/