java - 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);
解决方案
通过调用CompletableFuture.runAsync(...)
将任务提交给共同ForkJoinPool
的。此池由 JVM 管理。
由于它是一个公共池,因此无法保证/不能保证任务实际上是并发运行还是并行运行(其他任务可能会提交到池中,或者池可能只有一个线程可供使用,从而导致任务的顺序执行)。但在最好的情况下,它们将被并行处理。
一项Exception
任务不会对另一项任务产生任何影响(除非在任务中明确实施)。事实上,如果没有进一步的配置,Exception
将被默默地忽略(为了捕获Exception
s,可以在构造 a 时设置显式UncaughtExceptionHandler
ForkJoinPool
)。还可以通过调用(以了解任务是否已执行)和(以了解任务是否已完成ComletableFuture
)来确定 a 是否已通过 a 完成。本身可以通过调用来获得,但要注意调用时会抛出,而不是返回。Exception
isDone()
isCompletedExceptionally()
Exception
Exception
get()
Exception
get()
推荐阅读
- amazon-web-services - AWS CodeBuild 无法打印参数存储环境变量
- javascript - 忽略 php 中的 javascript 错误
- powershell - Powershell GUI 从电子邮件附件拖放空参数
- python - geoviews 数据集在覆盖 holoviews 平铺源时将纬度/经度转换为小数
- memory - JDK 11(和更新版本)DirectByteBuffer 即使在启动时也拥有大量的堆外内存
- terraform - 如何在具有单独 tfstate 文件的项目之间共享与环境无关的资源?
- android - 使用屏幕宽度和纵横比计算视图高度在 1440p 屏幕上不起作用
- android - 如何使用其他人创建但未构建的应用程序?
- ruby - Shopify 帮助退货订单项属性
- python-3.x - Boto3 - 使用 CLI 参数将多文件上传到特定 S3 存储桶“路径”