当前位置:  开发笔记 > 编程语言 > 正文

通过回调设置未来

如何解决《通过回调设置未来》经验,为你挑选了1个好方法。

我想实现以下伪代码说明的内容:

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

即functionA阻塞,直到调用了回调,然后处理结果并返回内容。

这样的事情有可能Future吗?通常的用法

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

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



1> Sotirios Del..:

Future具有有限的功能。从javadoc

A Future代表异步计算的结果。提供了一些方法来检查计算是否完成,等待其完成以及检索计算结果。

它仅公开读取操作(除外cancel)。您将无法实现您想要的Future

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

Future可明确地完成(设定其值和状态),并且可以被用作CompletionStage,支持相关的功能和动作的,其完成后触发。

您初始化 CompletableFuture

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

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有