¿Cómo esperar a que todos los subprocesos terminen, utilizando ExecutorService?

Necesito ejecutar una cantidad de tareas 4 a la vez, algo como esto:

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

¿Cómo puedo recibir una notificación una vez que todos estén completos? Por ahora no puedo pensar en nada mejor que configurar un contador de tareas global y disminuirlo al final de cada tarea, luego monitorear en bucle infinito este contador para que se convierta en 0; u obtenga una lista de Futuros y en el monitor de bucle infinito isDone para todos ellos. ¿Cuáles son las mejores soluciones que no involucran bucles infinitos?

Gracias.

Respuestas a la pregunta(24)

Su respuesta a la pregunta