Since you seem to know a priori how many tasks you have, just use a separate AtomicInteger .
int n = 5; ExecutorService executor = ... final AtomicInteger count = new AtomicInteger (n); final Phaser phaser = new Phaser (n); for (int i = 0; i < n; ++i) { Runnable task = new Runnable () { public void run () { phaser.arriveAndDeregister (); if (count.decrementAndGet () == 0) { doSomething (this); } } };
Or, if you need to call doSomething until you have notified of inactive parties, just override onAdvance and do it from there.
final Phaser phaser = new Phaser (n) { protected boolean onAdvance(int phase, int registeredParties) { doSomething(this); return super.onAdvance(phase, registeredParties); } };
source share