通过回调设置未来

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)

似乎在这里不起作用。我也不能改变这样的事实,我必须像这样设置回调。

Sot*_*lis 6

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因此您可以在完成时链接其他操作。