public static Task whenAll()

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();
  }