java - futures.forEach(CompletableFuture::join) 并行运行所有任务?

标签 java multithreading completable-future

我创建了多个可完成的 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/

相关文章:

java - 可以在 JDBC/MySQL 中检索更新的行吗?

java - 为什么会发生这种情况(Processing 和 UnfoldingMaps 的奇怪之处)

java - 将大型响应正文读取为 HttpClient

c# - 为什么 PLinq 不支持超过 63 个并行线程?

java - 如何处理 CompletableFuture 链中的错误响应?

java - 使用 Java CompletableFuture 方法时的同步行为

java - 按钮在第一个和最后一个索引处不起作用?

multithreading - Julia @threads single

Python - 多线程帮助 - 读取多个文件 - ETL 到 SQL Server

java - CompletableFuture.allOf 在抛出异常时取消其他 future