CommencerCommencer gratuitement

Mettre en place un pool de threads pour le traitement par lots

Imaginez que vous développez un système de traitement de documents qui doit gérer plusieurs documents simultanément. Chaque document nécessite un traitement intensif qui doit être effectué en parallèle, mais vous souhaitez limiter le nombre d’opérations concurrentes pour éviter une surcharge du système. Vous allez mettre en œuvre une solution avec ExecutorService pour gérer efficacement la charge de traitement.

Cet exercice fait partie du cours

Optimiser son code en Java

Afficher le cours

Instructions

  • Créez un pool de threads fixe contenant 3 threads.
  • Soumettez la méthode processDocument(doc) en tant que tâche à l’exécuteur.
  • Arrêtez l’exécuteur sans forcer l’arrêt immédiat.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

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";
    }
}
Modifier et exécuter le code