Поскольку вы, похоже, знаете априори , сколько у вас задач, просто используйте отдельную 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);
}
}
};
// run tasks using a thread-pool (order is not guaranteed)
executor.submit (task);
}
Или, если вам нужно позвонить doSomething
до того, как неактивные участники будут уведомлены, просто переопределите onAdvance
и сделайте это оттуда.
final Phaser phaser = new Phaser (n) {
protected boolean onAdvance(int phase, int registeredParties) {
doSomething(this);
return super.onAdvance(phase, registeredParties);
}
};