Implementacja puli wątków do przetwarzania wsadowego
Wyobraź sobie, że tworzysz system do przetwarzania dokumentów, który musi obsługiwać wiele dokumentów jednocześnie. Każdy dokument wymaga intensywnego przetwarzania wykonywanego równolegle, jednak chcesz ograniczyć liczbę jednoczesnych operacji, aby nie przeciążyć systemu. Zaimplementujesz rozwiązanie oparte na ExecutorService, które pozwoli efektywnie zarządzać obciążeniem.
To ćwiczenie jest częścią kursu
Optymalizacja kodu w Javie
Instrukcje do ćwiczenia
- Utwórz stałą pulę wątków zawierającą 3 wątki.
- Przekaż metodę
processDocument(doc)jako zadanie do executora. - Zakończ działanie executora bez wymuszania natychmiastowego zatrzymania.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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";
}
}