Implementando um pool de threads para processamento em lote
Imagine que você está desenvolvendo um sistema de processamento de documentos que precisa lidar com vários arquivos ao mesmo tempo. Cada documento exige um processamento intenso que deve ocorrer em paralelo, mas você quer limitar o número de operações concorrentes para evitar sobrecarga do sistema. Você vai implementar uma solução usando ExecutorService para gerenciar a carga de processamento com eficiência.
Este exercicio faz parte do curso
Otimização de Código em Java
Instruções do exercicio
- Crie um pool fixo de threads com 3 threads.
- Envie o método
processDocument(doc)como uma tarefa para o executor. - Encerre o executor sem forçar a finalização imediata.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
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";
}
}