IniziaInizia gratis

Implementare un thread pool per l'elaborazione in batch

Immagina di sviluppare un sistema di elaborazione documenti che deve gestire più documenti contemporaneamente. Ogni documento richiede un'elaborazione intensa che dovrebbe essere eseguita in parallelo, ma vuoi limitare il numero di operazioni concorrenti per evitare il sovraccarico del sistema. Implementerai una soluzione usando ExecutorService per gestire in modo efficiente il carico di lavoro di elaborazione.

Questo esercizio fa parte del corso

Ottimizzazione del codice in Java

Visualizza il corso

Istruzioni dell'esercizio

  • Crea un thread pool fisso con 3 thread.
  • Invia il metodo processDocument(doc) come task all'executor.
  • Arresta l'executor senza forzarne l'interruzione immediata.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

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";
    }
}
Modifica ed esegui il codice