![]() |
1
109
使用
关于您的实施的几点意见:
您对的使用
此外,
如果您想在第一次失败后立即异常完成整个计算,请在
此外,如果您想取消第一次失败时的剩余操作,请添加
|
![]() |
2
12
你可以得到Spotify的
如果您不想使用库,这里有一个简单的实现:
|
![]() |
3
11
像
Misha has pointed out
,你过度使用了
然后,取消(显式地或由于异常)这个递归组成的作业可能会递归执行,并且可能会失败
像
already shown by Misha
,有一种方法,
然而,值得注意的是,即使这样也没有必要。由于您使用的是无边界线程池执行器,因此您可以简单地发布一个异步作业,将结果收集到一个列表中,然后就完成了。等待完成是 隐含的 通过询问每项工作的结果。
当线程数量有限并且作业可能会产生额外的异步作业时,使用编写依赖操作的方法是很重要的,以避免等待作业从必须首先完成的作业中窃取线程,但这里的情况也不是这样。 在这种特定情况下,一个作业简单地在这大量的先决条件作业上迭代并在必要时等待可能比建模这大量的依赖性并让每个作业通知依赖作业完成更有效。 |
![]() |
4
6
要将@Misha接受的答案相加,可以将其进一步扩展为收集器:
现在您可以:
|
![]() |
5
5
在CompletableFuture上使用thenCombine的序列操作示例
如果您不介意使用第三方库 cyclops-react (我是作者)有一套CompletableFutures(以及Optionals、Streams等)的实用方法
|
![]() |
6
1
免责声明: 这并不能完全回答最初的问题。它将缺少“如果一个失败,就全部失败”的部分。然而,我无法回答实际的、更通用的问题,因为它是作为这个问题的副本关闭的: Java 8 CompletableFuture.allOf(...) with Collection or List 。所以我在这里回答:
摘要: 使用以下内容:
示例用法:
完整示例:
|
![]() |
7
1
你的任务可以很容易地完成,如下所示,
|
![]() |
8
0
除了Spotify Futures库,你可以尝试我的代码,位置在这里: https://github.com/vsilaev/java-async-await/blob/master/net.tascalate.async.examples/src/main/java/net/tascalate/concurrent/CompletionStages.java (与同一包中的其他类具有相关性) 它实现了一个逻辑,以返回“M中至少N个”CompletionStage-s,并带有允许容忍多少错误的策略。对于所有/任何情况,都有方便的方法,加上剩余期货的取消策略,加上代码处理CompletionStage-s(接口)而不是CompletableFuture(具体类)。 |
![]() |
9
0
Javaslang
有一个非常方便的
|