我想实现以下伪代码说明的内容:
int functionA() { Future res; // ... setCallbackForSomething(new Callback() { public void onCall() { // ... res = 5; } }); // ... return doSomethingElse(res.get()); }
即functionA阻塞,直到调用了回调,然后处理结果并返回内容。
这样的事情有可能Future
吗?通常的用法
Future res = executor.submit(...); ... res.get()
似乎在这里不起作用。我也不能改变这样的事实,我必须像这样设置回调。
Future
具有有限的功能。从javadoc
A
Future
代表异步计算的结果。提供了一些方法来检查计算是否完成,等待其完成以及检索计算结果。
它仅公开读取操作(除外cancel
)。您将无法实现您想要的Future
。
相反,从Java 8开始,您可以使用 CompletableFuture
阿
Future
可明确地完成(设定其值和状态),并且可以被用作CompletionStage
,支持相关的功能和动作的,其完成后触发。
您初始化 CompletableFuture
CompletableFutureres = new CompletableFuture<>();
并正常或例外地完成它
setCallbackForSomething(new Callback() { public void onCall() { // ... res.complete(5); // or handle exception } });
get
您可以将完成任务链接到上,而不用CompletableFuture
调用doSomethingElse
。
res.thenAccept(value -> doSomethingElse(value));
尽管您仍然可以拨打电话,但可以get
阻塞直到将来完成。
在Java 8之前,Guava库提供SettableFuture
了实现承诺值的“设置”部分的功能。但这也是一个,ListenableFuture
因此您可以在完成时链接其他操作。