Effizientes Warten auf einer Liste von Futures
Beim Umgang mit einer Liste von Futures besteht das Ziel darin, bis zum Abschluss oder Eintritt von zu warten in Zukunft eine Ausnahme sein. Ein naiver Ansatz mit einzelnen Aufrufen von f.get() kann zu unnötigem Warten führen, wenn eine Ausnahme frühzeitig auftritt.
Unnötiges Warten mit CompletionService vermeiden
Um dieses Problem zu beheben Bei diesem Problem kommt die CompletionService-Klasse ins Spiel. Es ermöglicht die Ausführung asynchroner Aufgaben und den Thread-sicheren Abruf ihrer Ergebnisse, sobald sie verfügbar sind. So verwenden Sie es:
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
Mit dem CompletionService-Ansatz können Sie den Abschluss von Aufgaben in Echtzeit überwachen und die weitere Verarbeitung stoppen, wenn ein Fehler auftritt, wodurch unnötige Wartezeiten vermieden werden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3