Эффективное ожидание списка фьючерсов
При работе со списком фьючерсов цель состоит в том, чтобы дождаться завершения или появления исключение в любом будущем. Наивный подход, включающий отдельные вызовы f.get(), может привести к ненужному ожиданию, если исключение возникнет на раннем этапе.
Избежание ненужного ожидания с помощью CompletionService
Чтобы решить эту проблему проблема, в игру вступает класс CompletionService. Он позволяет выполнять асинхронные задачи и получать их результаты потокобезопасным способом по мере их доступности. Вот как его использовать:
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
Используя подход CompletionService, вы можете отслеживать выполнение задач в режиме реального времени и останавливать дальнейшую обработку в случае возникновения ошибки, избегая тем самым ненужного ожидания.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3