in Bolts/src/bolts/Task.java [254:300]
public static Task<Void> whenAll(Collection<? extends Task<?>> tasks) {
if (tasks.size() == 0) {
return Task.forResult(null);
}
final Task<Void>.TaskCompletionSource allFinished = Task.<Void> create();
final ArrayList<Exception> errors = new ArrayList<Exception>();
final Object errorLock = new Object();
final AtomicInteger count = new AtomicInteger(tasks.size());
final AtomicBoolean isCancelled = new AtomicBoolean(false);
for (Task<?> task : tasks) {
@SuppressWarnings("unchecked")
Task<Object> t = (Task<Object>) task;
t.continueWith(new Continuation<Object, Void>() {
@Override
public Void then(Task<Object> task) {
if (task.isFaulted()) {
synchronized (errorLock) {
errors.add(task.getError());
}
}
if (task.isCancelled()) {
isCancelled.set(true);
}
if (count.decrementAndGet() == 0) {
if (errors.size() != 0) {
if (errors.size() == 1) {
allFinished.setError(errors.get(0));
} else {
allFinished.setError(new AggregateException(errors));
}
} else if (isCancelled.get()) {
allFinished.setCancelled();
} else {
allFinished.setResult(null);
}
}
return null;
}
});
}
return allFinished.getTask();
}