我有几个单独的操作,我想以与JS中的promise
相同的风格链接这些操作。
所以目前我有这样的代码:
CompletableFuture<Data1> data1 = ...;
CompletableFuture<Data2> data2 = ...;
// Fetch in parallel!
CompletableFuture.allOf(
data1,
data2
).join(); // wait 2 threads to finish
CompletableFuture<Data3> data3 = ... // i need data1 here
data3.join();
可以在一个链中重写吗?有点:
CompletableFuture.allOf(
data1,
data2
)
.then((result1, result2) -> return another CompletableFuture)
.then(result3 -> { ...do other stuff here})
CompletableFuture.allOf(…)
返回CompletableFuture
给定CompletableFuture
的结果(如果有)不会反映在返回的CompletableFuture
中,但可以通过单独检查它们来获得。
因此,如果要
使用 data1
和 data2
的返回值,则必须获取它们。
使用allOf
时,无法在输入期货上调用join
以获取依赖函数中的值(尽管您会知道这些调用不会阻塞)。
但是,当您正好有两个期货要组合时,就没有必要使用< code > allOf ;您可以顺利地将它们结合起来:
CompletableFuture<FinalResult> f = data1
.thenCombine(data2, (result1, result2) -> another CompletableFuture)
.thenCompose(Function.identity())
.thenAccept(result3 -> …);
thenAccept
将评估将结果值映射到新结果值的函数,而thenCompose
将评估将一个结果值映射至新未来的函数。方法thenCombine
是theAccept
的两个未来变体,允许将两个值映射到一个新值。
但thenCombine
没有两个未来变体,因此解决方案是将由两个中间值创建的未来视为一个值(获取未来的未来),然后thenCompose(Function.identity())
来将“值”映射到未来。然后,在未来完成后,我们可以链接一个函数来处理第三个结果。
我正在尝试将方法的调用/结果链接到下一个调用。我得到了编译时错误方法,因为if无法从前一次调用中获得objB的引用。 如何将上一次调用的结果传递给下一个链?我是不是完全误解了这个过程?
我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任
问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作:
问题内容: 我正在使用Java 8可完成的期货。我有以下代码: 我使用runAsync计划执行等待闩锁的代码。接下来,我取消了将来,希望将被中断的异常抛出内部。但是似乎线程在await调用上仍然处于阻塞状态,即使将来被取消(断言通过)也永远不会抛出InterruptedException。使用ExecutorService的等效代码可以正常工作。是CompletableFuture中的错误还是我的
如果一个字段在可完成的未来代码中为空,我必须发送一个异常: 这个想法是,如果孩子的字段为空(在本例中为lastName),我必须抛出一个自定义异常,我不太确定如何实现这一点。 我的想法是使用thenAccept方法发送异常,如下所示: 我必须评估数据库中的lastName是否为空,我必须抛出一个异常。 有什么想法吗?
我有一个实例列表。 如何将他们转变成这样一个未来: