我想实现以下伪代码所示的内容:
int functionA() {
Future res;
// ...
setCallbackForSomething(new Callback() {
public void onCall() {
// ...
res = 5;
}
});
// ...
return doSomethingElse(res.get());
}
即。函数A阻塞,直到调用回调,然后处理结果并返回一些东西。
Future
是否可以这样?通常的用法,
Future res = executor.submit(...);
...
res.get()
似乎在这里不起作用。我也无法改变我必须像这样设置回调的事实。
答案 0 :(得分:5)
Future
功能有限。来自javadoc
Future
表示异步计算的结果。方法 用于检查计算是否完成,等待它 完成,并检索计算结果。
它只公开读操作(cancel
除外)。您无法通过Future
实现所需目标。
相反,从Java 8开始,您可以使用CompletableFuture
可以明确完成的
Future
(设置其值和 status),可以用作CompletionStage
,支持依赖 完成后触发的功能和动作。
您初始化CompletableFuture
CompletableFuture<Integer> res = new CompletableFuture<>();
setCallbackForSomething(new Callback() {
public void onCall() {
// ...
res.complete(5); // or handle exception
}
});
您可以get
CompletableFuture
拨打doSomethingElse
,而不是致电res.thenAccept(value -> doSomethingElse(value));
。
"title": "someServerName"
如果您愿意,仍然可以拨打chain a completion task,阻止直到将来完成。
在Java 8之前,Guava库提供get
来实现&#34; set&#34;承诺价值的一部分。但它也是SettableFuture
,因此您可以在完成时链接其他操作。