从回调中设定未来

时间:2016-01-06 15:09:49

标签: java concurrency future

我想实现以下伪代码所示的内容:

int functionA() {
    Future res;
    // ...
    setCallbackForSomething(new Callback() {
        public void onCall() {
            // ...
            res = 5;
        }
    });
    // ...
    return doSomethingElse(res.get());
}

即。函数A阻塞,直到调用回调,然后处理结果并返回一些东西。

Future是否可以这样?通常的用法,

Future res = executor.submit(...);
...
res.get()

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

1 个答案:

答案 0 :(得分:5)

Future功能有限。来自javadoc

  

Future表示异步计算的结果。方法   用于检查计算是否完成,等待它   完成,并检索计算结果。

它只公开读操作(cancel除外)。您无法通过Future实现所需目标。

相反,从Java 8开始,您可以使用CompletableFuture

  

可以明确完成的Future(设置其值和   status),可以用作CompletionStage,支持依赖   完成后触发的功能和动作。

您初始化CompletableFuture

CompletableFuture<Integer> res = new CompletableFuture<>();

并完成normallyexceptionally

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