Sobes.tech
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:

  1. 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ń
    
  2. 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);
    });
    
  3. 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());