Esperando eficientemente em uma lista de futuros
Ao lidar com uma lista de futuros, o objetivo é esperar até a conclusão ou a ocorrência de uma exceção em qualquer futuro. Uma abordagem ingênua envolvendo chamadas individuais para f.get() pode levar a uma espera desnecessária se uma exceção ocorrer logo no início.
Evitando espera desnecessária com CompletionService
Para resolver isso problema, a classe CompletionService entra em ação. Ele permite que tarefas assíncronas sejam executadas e seus resultados sejam recuperados de maneira segura para threads à medida que ficam disponíveis. Veja como usá-lo:
Executor executor = Executors.newFixedThreadPool(4);
CompletionService completionService = new ExecutorCompletionService(executor);
// Submit tasks to the service
for (int i = 0; i () {
@Override
public SomeResult call() {
// Task logic here
return result;
}
});
}
int received = 0;
boolean errors = false;
// Loop until all tasks are complete or an error occurs
while (received resultFuture = completionService.take(); // Blocks if nothing available
try {
SomeResult result = resultFuture.get();
received ;
// Process result here
} catch (Exception e) {
// Log error
errors = true;
}
}
// Consider canceling remaining tasks if an error occurred
Ao usar a abordagem CompletionService, você pode monitorar a conclusão das tarefas em tempo real e interromper o processamento adicional se ocorrer um erro, evitando assim esperas desnecessárias.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3