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 immediatelyRę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 completedget() 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 doneisDone, 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 > 3sSzybkie 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
- Tworzenie i uzupełnianie CompletableFuture
- Łączenie za pomocą thenApply i thenCompose
- Łączenie future: allOf i anyOf
- Obsługa błędów i asynchroniczny potok HTTP