Esperar eficientemente en una lista de futuros
Cuando se trata de una lista de futuros, el objetivo es esperar hasta que se complete o se produzca una excepción en cualquier futuro. Un enfoque ingenuo que incluya llamadas individuales a f.get() puede llevar a esperas innecesarias si se produce una excepción desde el principio.
Evitar esperas innecesarias con CompletionService
Para solucionar este problema problema, la clase CompletionService entra en juego. Permite ejecutar tareas asincrónicas y recuperar sus resultados de forma segura para subprocesos a medida que estén disponibles. Aquí se explica cómo usarlo:
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
Al utilizar el enfoque CompletionService, puede monitorear la finalización de las tareas en tiempo real y detener el procesamiento adicional si ocurre un error, evitando así esperas innecesarias.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3