Jak czekać na zakończenie wszystkich wątków, używając ExecutorService?

Muszę wykonać pewną ilość zadań 4 na raz, coś takiego:

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
    taskExecutor.execute(new MyTask());
}
//...wait for completion somehow

Jak mogę otrzymać powiadomienie, gdy wszystkie z nich są kompletne? Na razie nie mogę myśleć o niczym lepszym niż ustawienie jakiegoś globalnego licznika zadań i zmniejszenie go na końcu każdego zadania, a następnie monitorowanie w nieskończonej pętli tego licznika, aby stał się 0; lub uzyskaj listę kontraktów terminowych i nieskończoną pętlę monitora dla wszystkich. Jakie są lepsze rozwiązania nie obejmujące nieskończonych pętli?

Dzięki.

questionAnswers(24)

yourAnswerToTheQuestion