我已经阅读了很多关于 CompletableFutures 的内容,他们关注 CompletableFuture 无法像 Future 那样访问底层计算代码这一事实。那么,如何从与 completableFuture 关联的任何任务中发出完成()或取消()(或检查 isCancelled(),如果您想从外部中断计算)?
编辑:让我感到困惑的一件事是,CF 被用于替代替代品,因为它的可组合性或手动可设置性,在我看来,提供的实现非常正交,例如:
CompletableFuture.runAsync(() -> {
if(myCondition) CF_REF?.complete();
else CF_REF?.exceptionally();
}).thenApply(() -> {
if (myOtherCondition) CF_REF_2?.complete();
(...)
以不是“可完成”+“可组合”的方式设计它有什么意义?
我想找到一种方法来使用它们,就好像 CF 使用类似于假设的 CompletableCallable 的接口作为输入,但不知道如何。Function<CompletableFuture,T>
代替 Callables/Runnables 之类的东西,所以我们可以将其用作:
CompletableFuture CF_REF_BIS = CompletableFuture.runAsync((CF_REF) -> {
if(myCondition) CF_REF.complete();
else CF_REF.exceptionally();
});
CF_REF_BIS.thenApply(...)
当要计算代码时,内部执行机制将返回 CF_REF_BIS 引用,因为在未来的计算中实际作为 CF_REF 传递,而无需跨范围访问它。
这意味着我们可以简单地通过创建 new CompeltableCallable() 然后在任何线程可以访问 CompletableFuture 信号量的任何地方提交 n 次来重用去匿名化计算代码
例如:
CompletableFuture CF_REF = CompletableFuture.runAsync(myCompletableCallable)
.thenApply(myCompletableCallable) //again
.thenApply(anotherCompletableCallable);
有没有办法满足这种需求?我是不是忘记了什么?我的方法有什么根本的不一致吗?Java CompletableFuture 是否还在半途而废的便捷设计中?