我需要调用一个方法来返回一个Future
,对于List<Principal>
中的每个元素,我都需要调用一次该方法,因此最终会得到一个List<Future<UserRecord>>
。
返回Future
的方法是库代码,我无法控制该代码如何运行,我只有Future
这个对象。
在进一步操作之前,我希望等待所有Future
完成(成功或失败)。
是否有更好的方法来实现这一点,而不是使用以下方法:
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));
如果您有兴趣:
private boolean allNotCompleted(boolean[] completed) {
for (boolean b : completed) {
if (!b)
return true;
}
return false;
}
与等待一个 Future 列表的答案不同,我无法控制创建 Future
的代码。
allNotCompleted(taskCompleted)
这段代码片段会检查整个数组并返回一个总体结果吗? - Sachith Dickwellafor (Future<UserRecord> future : futures) results.add(future.get());
有什么问题吗? - shmosel