Mettre en place un bassin de fils d'exécution pour le traitement par lots
Imaginez que vous développez un système de traitement de documents qui doit gérer plusieurs documents en même temps. Chaque document nécessite un traitement intensif qui devrait s'exécuter en parallèle, mais vous souhaitez limiter le nombre d'opérations concomitantes pour éviter de surcharger le système. Vous allez mettre en œuvre une solution avec ExecutorService afin de gérer efficacement la charge de traitement.
Cette activité fait partie du cours
Optimiser le code en Java
Instructions de l’exercice
- Créez un bassin de fils d'exécution fixe contenant 3 fils.
- Soumettez la méthode
processDocument(doc)comme tâche à l'exécuteur. - Fermez l'exécuteur sans forcer l'arrêt immédiat.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
public class DocumentProcessor {
public static void main(String[] args) throws InterruptedException {
List documents = List.of("Doc1", "Doc2", "Doc3", "Doc4", "Doc5");
List> futures = new ArrayList<>();
// Create a fixed thread pool with 3 threads
ExecutorService executor = Executors.____(____);
for (String doc : documents) {
// Submit the processDocument() method to the executor
futures.add(executor.submit(() -> ____(____)));
}
// Shutdown the executor and wait for termination
executor.____();
executor.awaitTermination(10, TimeUnit.SECONDS);
try {
for (Future future : futures) {
System.out.println(future.get());
}
} catch (ExecutionException e) {
System.out.println("Error processing documents: " + e.getMessage());
}
}
private static String processDocument(String docId) throws InterruptedException {
System.out.println("Processing " + docId + " on thread " + Thread.currentThread().getName());
Thread.sleep((long) (Math.random() * 1000));
return docId + " Processed";
}
}