Middle
Do czego służy CompletableFuture w Java?
sobes.tech AI
Odpowiedź od AI
CompletableFuture jest używany do wykonywania zadań asynchronicznych i komponowania operacji asynchronicznych. Reprezentuje wynik operacji asynchronicznej, który może zostać ukończony w przyszłości.
Główne zalety i powody do używania:
- Wykonanie asynchroniczne: Pozwala na wykonywanie zadań w tle, nie blokując głównego wątku.
- Kompozycja operacji asynchronicznych: Umożliwia łączenie kilku zadań asynchronicznych, określając, jak mają być wykonywane kolejno lub równolegle, oraz przetwarzanie ich wyników.
- Obsługa wyjątków: Zapewnia mechanizmy obsługi błędów w zadaniach asynchronicznych.
- Elastyczność: Obsługuje różne metody przetwarzania wyniku (np. zastosowanie funkcji, wykonanie kolejnego zadania) i określenie wątków wykonawczych.
Przykłady użycia:
-
Wykonanie kilku niezależnych zadań równolegle i oczekiwanie na ich zakończenie:
// Przykład równoległego wykonania dwóch zadań CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { // Długa operacja 1 return "Wynik 1"; }); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { // Długa operacja 2 return "Wynik 2"; }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2); combinedFuture.join(); // Oczekiwanie na zakończenie obu zadań -
Wykonanie operacji asynchronicznych sekwencyjnie:
// Przykład sekwencyjnego wykonywania zadań CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Wartość początkowa"); CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> { // Przekształcenie wyniku return result.length(); }); transformedFuture.thenAccept(length -> { System.out.println("Długość łańcucha: " + length); }); -
Obsługa wyjątków:
// Przykład obsługi wyjątków CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Wystąpił błąd"); } return "Sukces"; }).exceptionally(ex -> { System.err.println("Obsługa błędu: " + ex.getMessage()); return "Obsługiwany błąd"; // Wartość zapasowa }); System.out.println(errorFuture.join());