Реалізація пула потоків для пакетної обробки
Уявімо, що ви розробляєте систему обробки документів, яка має працювати з кількома документами одночасно. Кожен документ потребує інтенсивної обробки, яку слід виконувати паралельно, але ви хочете обмежити кількість одночасних операцій, щоб не перевантажувати систему. Ви реалізуєте розв'язання за допомогою ExecutorService, щоб ефективно керувати навантаженням на обробку.
Ця вправа є частиною курсу
Оптимізація коду в Java
Інструкції до вправи
- Створіть фіксований пул потоків із 3 потоків.
- Передайте метод
processDocument(doc)як завдання до виконувача. - Завершіть роботу виконувача без примусового негайного зупинення.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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";
}
}