多个ListenableFutures返回后继续执行

时间:2016-01-13 02:05:14

标签: java guava

我有一个应用程序,它接受用户命令来执行数据库查找。我解析命令/参数,然后迭代每一个,调用一个处理程序,它接受值并构建一个查询条件。

然而,到目前为止,这个过程完全同步。每个处理程序都会执行并添加条件,在循环完成后我可以执行查询。

现在,其中一个处理程序必须联系远程服务器以转换某些数据,这意味着它返回ListenableFuture

ListenableFuture<Profile> profile = getProfile("someUserName");

profile.addListener(new Runnable() {
    @Override
    public void run() {
        try {
            query.addCondition(Condition.of("user.$id", MatchRule.EQUALS, profile.get().getUniqueId()));
        } catch (InterruptedException | ExecutionException e) {
           // handle
        }
    }
}, MoreExecutors.sameThreadExecutor());

我正在尝试确定在ListenableFuture完成之前确保不执行查询的最佳方法。令我困惑的部分原因是,我需要假设可能存在多个未决请求。

例如,如果有人输入p=user1,user2,我们需要发出两个请求,因此会有两个ListenableFuture<Profile>未决。

只有两个完成后,才能执行最终查询。

我该怎么做?

1 个答案:

答案 0 :(得分:3)

Futures.allAsList可以让你获得一堆ListenableFutures并获得一个ListenableFuture,当所有输入完成并完成后返回结果列表。这听起来像你需要的。