gpt4 book ai didi

java - 等待 Completable future 线程完成的推荐方法是什么

转载 作者:IT老高 更新时间:2023-10-28 21:01:37 26 4
gpt4 key购买 nike

我正在使用 CompletableFuture 如下代码所示。但是关于我应该等到所有可运行对象完成的方式,我找到了两种方法,我不知道它们之间的区别,哪一种是最佳实践?它们如下:

代码:

this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);

等待所有可运行对象完成的第一种方法:

this.growSeedExecutor.shutdown();
this.growSeedExecutor.awaitTermination(1, TimeUnit.DAYS);

第二种等待所有可运行对象完成的方法:

CompletableFuture.allOf(this.growSeedFutureList).join();

请告诉我推荐哪一个。

最佳答案

如果你真的想等待所有的 future ,你可以简单地在每个 future 上调用 join():

growSeedFutureList.forEach(CompletableFuture::join);

与使用 allOf() 相比的主要区别在于,这将在到达以异常完成的 future 时立即抛出异常,而 allOf().join() 版本只会在所有 future 都完成后抛出异常(无论是否异常)。

另一个小的区别是这不会创建中间的 allOf 阶段。如果您想在所有 future 完成后异步执行某项操作,而不是仅仅等待所有 future 完成,这样的阶段仍然很有用。

执行者在另一边的解决方案有几个缺点:

  • 它阻止重复使用执行器,因为它需要关闭;
  • 它要求您对所有操作都使用该执行器 - 它不适用于以其他方式管理的 CompletableFuture
  • 它没有清楚地表明你的意图,即等待所有 future 完成;
  • 实现起来更复杂;
  • 它不处理异常完成 - 如果其中一项任务失败,awaitTermination() 不会抛出异常。

关于java - 等待 Completable future 线程完成的推荐方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com