0Pricing
Java Academy · Lekcja

Tworzenie i uzupełnianie CompletableFuture

Używaj supplyAsync, runAsync i completedFuture oraz ręcznie kończ przyszłe obiekty za pomocą complete i completeExceptionally.

Tworzenie i uzupełnianie CompletableFuture to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest CompletableFuture?

CompletableFuture<T> (Java 8+) reprezentuje asynchroniczne obliczenie, które można jawnie ukończyć, łączyć w łańcuchy i składać z innymi obliczeniami. Implementuje zarówno Future, jak i CompletionStage.

supplyAsync: Rozpoczynanie obliczenia asynchronicznego

CompletableFuture.supplyAsync() uruchamia obiekt Supplier we wspólnej puli ForkJoinPool i zwraca future z wynikiem.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // runs on ForkJoinPool.commonPool()
    return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");

runAsync: Uruchom i zapomnij

runAsync() uruchamia obiekt Runnable asynchronicznie i zwraca CompletableFuture<Void>. Należy go używać, gdy wynik nie jest potrzebny.

CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
    sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));

Własny executor

Należy przekazać własny obiekt Executor, aby kontrolować pulę wątków używaną do obliczeń — jest to kluczowe w aplikacjach internetowych, w których należy unikać blokowania wspólnej puli.

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
    () -> userService.findById(42L), pool
);

completedFuture: Wartość już gotowa

CompletableFuture.completedFuture(value) zwraca future, który został już ukończony. Jest to przydatne podczas testowania lub wtedy, gdy dostępna jest natychmiastowa wartość do zwrócenia w asynchronicznym potoku.

CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediately

Ręczne kończenie future

Za pomocą complete() można dostarczyć wynik spoza obliczenia. Za pomocą completeExceptionally() można zasygnalizować niepowodzenie.

CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!");       // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get();   // blocks until completed

get() i join()

Zarówno get(), jak i join() blokują wykonywanie do czasu ukończenia future. get() zgłasza sprawdzane wyjątki, natomiast join() opakowuje je w niesprawdzony wyjątek CompletionException.

try {
    String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)

getNow() do sprawdzania bez blokowania

getNow(defaultValue) zwraca wynik, jeśli obliczenie zostało już ukończone, albo podaną wartość domyślną, jeśli nie — nie blokuje i nie czeka.

String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet done

isDone, isCancelled, isCompletedExceptionally

Stan future można sprawdzić bez blokowania. Takie sprawdzanie można połączyć w pętlach odpytywania lub kodzie monitorującym.

if (future.isDone())                    System.out.println("Completed");
if (future.isCancelled())               System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");

cancel() do obsługi limitu czasu

Należy wywołać cancel(true), aby anulować trwające obliczenie. Future przechodzi do stanu anulowania, a każde blokujące wywołanie get() zgłasza CancellationException.

CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);

completeOnTimeout (Java 9+)

completeOnTimeout(value, timeout, unit) automatycznie kończy future z wartością domyślną, jeśli nie zostanie on ukończony w określonym czasie — jest to prostsze rozwiązanie niż ręczne anulowanie.

CompletableFuture<String> result = fetchAsync()
    .completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3s

Szybkie sprawdzenie

Która metoda uruchamia asynchroniczne obliczenie we wspólnej puli ForkJoinPool i zwraca wartość?

Podsumowanie

supplyAsync / runAsync rozpoczynają pracę asynchroniczną. complete / completeExceptionally ręcznie kończą obliczenia. Do blokowania z niesprawdzanymi wyjątkami należy używać join(). completeOnTimeout zapewnia przejrzystą obsługę limitów czasu.

Często zadawane pytania

Czy lekcja „Tworzenie i uzupełnianie CompletableFuture” jest bezpłatna?

Tak — pełny tekst „Tworzenie i uzupełnianie CompletableFuture” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Tworzenie i uzupełnianie CompletableFuture”?

Używaj supplyAsync, runAsync i completedFuture oraz ręcznie kończ przyszłe obiekty za pomocą complete i completeExceptionally. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Tworzenie i uzupełnianie CompletableFuture”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie i uzupełnianie CompletableFuture
  2. Łączenie za pomocą thenApply i thenCompose
  3. Łączenie future: allOf i anyOf
  4. Obsługa błędów i asynchroniczny potok HTTP
← Powrót do Java Academy