Ejecutores: ¿Cómo esperar sincrónicamente hasta que todas las tareas hayan finalizado si las tareas se crean recursivamente?

Mi pregunta está fuertemente relacionada coneste de aquí. Como se publicó allí, me gustaría que el hilo principal esperara hasta que la cola de trabajo esté vacía y todas las tareas hayan finalizado. El problema en mi situación es, sin embargo, que cada tarea puede provocar recursivamente nuevas tareas para ser procesadas. Esto hace que sea un poco incómodo recopilar todos los futuros de esas tareas.

Nuestra solución actual utiliza un ciclo de espera ocupado para esperar la terminación:

        do { //Wait until we are done the processing
      try {
        Thread.sleep(200);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    } while (!executor.getQueue().isEmpty()
             || numTasks.longValue() > executor.getCompletedTaskCount());

numTasks es un valor que se incrementa a medida que se crea cada nueva tarea. Esto funciona, pero creo que no es muy agradable debido a la espera ocupada. Me preguntaba si hay una buena manera de hacer que el hilo principal espere sincrónicamente, hasta que se lo despierte explícitamente.

Respuestas a la pregunta(9)

Su respuesta a la pregunta