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