CommencezCommencez gratuitement

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

Voir le cours

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