【发布时间】:2015-11-30 02:23:01
【问题描述】:
我已经阅读了很多关于 CompletableFutures 的文章,他们关注 CompletableFuture 无法像 Future 那样访问底层计算代码这一事实。那么,如何从与 completableFuture 关联的任何任务中发出 complete() 或 cancel()(或检查 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() 然后在任何地方提交 n 次,任何线程都可以访问 CompletableFuture 信号量
例如:
CompletableFuture CF_REF = CompletableFuture.runAsync(myCompletableCallable)
.thenApply(myCompletableCallable) //again
.thenApply(anotherCompletableCallable);
有没有办法满足这种需求?我是不是忘记了什么?我的方法有什么根本的不一致吗? Java CompletableFuture 是否还在半途而废的便捷设计中?
【问题讨论】:
标签: multithreading java-8 java.util.concurrent completable-future