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
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";
}
}