public <F extends ListenableFuture<? extends I>> F track(final F job) { startedCount.incrementAndGet(); if (!isAcceptingNewJobs()) job.cancel(completionPromise.wasCancelledWithInterruption()); job.addListener( () -> { try { handleCompletedJob(job); } catch (Exception e) { abort(FunFuture.unwrapExecutionException(e)); } finally { completedCount.incrementAndGet(); checkDone(); } }, jobCompletionExecutor); return job; }