Ou você submete a um executor de virtual threads e faz join nos resultados, ou compõe com CompletableFuture usando supplyAsync num executor explícito e allOf para esperar. Coloque um timeout na operação combinada, trate a falha parcial de forma deliberada e cancele os irmãos quando um falhar. Structured concurrency com um task scope expressa exatamente esse formato e amarra o tempo de vida das subtarefas ao bloco, embora ainda seja uma API preview.
Por que os entrevistadores perguntam isso
Fan out e join é o formato de concorrência mais comum num serviço, e o entrevistador quer ver você tratando as partes sem glamour: em qual executor o trabalho roda, o que acontece quando uma chamada falha ou trava, e se as outras chamadas são canceladas. Saber que o pool assíncrono padrão é o common pool compartilhado, e por que fornecer o seu próprio executor importa, é o detalhe que separa uso real de uso de tutorial.
Como estruturar sua resposta
- Escolha uma abordagem e diga onde as tarefas realmente rodam.
- Combine os resultados e coloque um timeout geral.
- Defina a política de falha parcial explicitamente.
- Cite structured concurrency como o formato moderno mais claro.
Exemplo de resposta
Com virtual threads isso ficou simples: eu abro um executor que cria uma thread por tarefa, submeto as três chamadas e faço join em cada future. Ele lê como sequencial, mas as chamadas se sobrepõem, e cada uma tem o próprio timeout de cliente. Se estou numa base mais antiga eu uso CompletableFuture com supplyAsync, e sempre passo o meu próprio executor, porque o padrão é o common ForkJoinPool, que é dimensionado para trabalho de CPU e compartilhado por tudo no processo. Depois allOf para esperar, e um timeout no future combinado para que uma dependência travada não segure a requisição para sempre. A parte em que eu penso mais é a falha parcial: se a chamada de recomendações falha, eu falho a página inteira ou renderizo sem elas? Normalmente a resposta é degradar, então esse future ganha um handler exceptionally retornando uma lista vazia, enquanto as chamadas essenciais propagam. Structured concurrency expressa isso muito melhor, já que um scope faz join em todas as subtarefas e cancela o resto quando uma falha ou o prazo estoura, e eu uso onde uma API preview é aceitável.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Qual executor o supplyAsync usa se você não passar um?
- Como você cancela as outras chamadas quando uma falha?
- Qual é a diferença entre thenApply e thenCompose?
Mais perguntas para Desenvolvedor Java
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas