O las envías a un executor de hilos virtuales y haces join de los resultados, o las compones con CompletableFuture usando supplyAsync sobre un executor explícito y allOf para esperar. Pon un timeout a la operación combinada, decide a conciencia qué pasa ante un fallo parcial, y cancela las hermanas cuando una falla. La concurrencia estructurada con un task scope expresa exactamente esta forma y ata el ciclo de vida de las subtareas al bloque, aunque sigue siendo una API en preview.
Por qué lo preguntan los entrevistadores
Repartir y unir es la forma de concurrencia más común en un servicio, y el entrevistador quiere verte manejar las partes poco glamurosas: en qué executor corre el trabajo, qué pasa cuando una llamada falla o se cuelga, y si las otras llamadas se cancelan. Saber que el pool asíncrono por defecto es el pool común compartido, y por qué importa aportar el tuyo, es el detalle que separa el uso real del uso de tutorial.
Cómo estructurar tu respuesta
- Elige un enfoque y di dónde corren realmente las tareas.
- Combina los resultados y pon un timeout global.
- Decide de forma explícita la política ante fallo parcial.
- Menciona la concurrencia estructurada como la forma moderna más clara.
Ejemplo de respuesta
Con los hilos virtuales esto se volvió sencillo: abro un executor que crea un hilo por tarea, envío las tres llamadas y luego hago join de cada future. Se lee de forma secuencial, pero las llamadas se solapan, y cada una tiene su propio timeout de cliente. Si estoy en una base de código antigua uso CompletableFuture con supplyAsync, y siempre le paso mi propio executor, porque el de por defecto es el ForkJoinPool común, dimensionado para trabajo de CPU y compartido por todo el proceso. Luego allOf para esperar, y un timeout sobre el future combinado para que una dependencia colgada no retenga la petición para siempre. La parte que más pienso es el fallo parcial: si falla la llamada de recomendaciones, ¿tumbo la página entera o la renderizo sin ellas? Normalmente la respuesta es degradar, así que ese future lleva un manejador exceptionally que devuelve una lista vacía, mientras que las llamadas esenciales sí propagan. La concurrencia estructurada expresa esto mucho mejor, ya que un scope hace join de todas las subtareas y cancela el resto cuando una falla o vence el plazo, y la uso donde una API en preview sea aceptable.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Qué executor usa supplyAsync si no le pasas uno?
- ¿Cómo cancelas las otras llamadas cuando una falla?
- ¿Cuál es la diferencia entre thenApply y thenCompose?
Más preguntas para Desarrollador Java
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas