等待List <Future>中的每个Future都要完成

mar*_*gti 1 java concurrency future java-8

我调用一个方法,为a Future中的每个元素返回一次List<Principal>,所以我最终得到一个List<Future<UserRecord>>.

返回的方法Future是库代码,我无法控制代码的运行方式,我只有Future.

我想等待所有的Futures完成(成功或失败),然后再继续.

有没有比这更好的方法:

List<Principal> users = new ArrayList<>();
// Fill users
List<Future<UserRecord>> futures = getAllTheFutures(users);
List<UserRecord> results = new ArrayList<>(futures.size());
boolean[] taskCompleted = new boolean[futures.size()];
for (int j = 0; j < taskCompleted.length; j++) {
    taskCompleted[j] = false;
}
do {
    for (int i = 0; i < futures.size(); i++) {
        if (!taskCompleted[i]) {
            try {
                results.add(i, futures.get(i).get(20, TimeUnit.MILLISECONDS));
                taskCompleted[i] = true;
            } catch (TimeoutException e) {
                // Do nothing
            } catch (InterruptedException | ExecutionException e) {
                // Handle appropriately, then...
                taskCompleted[i] = true;
            }
        }
    }
} while (allNotCompleted(taskCompleted));
Run Code Online (Sandbox Code Playgroud)

对于好奇:

private boolean allNotCompleted(boolean[] completed) {
    for (boolean b : completed) {
        if (!b)
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

与在等待未来列表中的等待答案不同,我无法控制创建Futures 的代码.

Kay*_*man 5

您的代码可以简化很多.除非您具有未在问题中指定的要求,否则可以按如下方式编写等效版本.

List<Principal> users = // fill users
List<Future<UserRecord>> futures = getAllTheFutures(users);
List<UserRecord> results = new ArrayList<>();

for (int i = 0; i < futures.size(); i++) {
        try {
            results.add(futures.get(i));
        } catch (InterruptedException | ExecutionException e) {
            // Handle appropriately, results.add(null) or just leave it out
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @markvgti:`for`循环按顺序迭代元素,`add`将追加到列表的当前末尾,因此结果列表的顺序与源列表的顺序相同.事实上,即使这个答案的代码也比必要的复杂.一个更简单的`for(Future <UserRecord> future:futures)试试{results.add(future); } catch(...){...}`也可以.无需处理指数. (3认同)