Oprettelse og færdiggørelse af CompletableFutures
Brug supplyAsync, runAsync og completedFuture, og færdiggør futures manuelt med complete og completeExceptionally.
Oprettelse og færdiggørelse af CompletableFutures er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad er CompletableFuture?
CompletableFuture<T> (Java 8+) repræsenterer en asynkron beregning, der kan fuldføres eksplicit, kædes sammen og kombineres. Den implementerer både Future og CompletionStage.
supplyAsync: Start en asynkron beregning
CompletableFuture.supplyAsync() kører en Supplier i den fælles ForkJoinPool og returnerer en future med resultatet.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// runs on ForkJoinPool.commonPool()
return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");runAsync: Asynkron kørsel uden resultat
runAsync() kører en Runnable asynkront og returnerer CompletableFuture<Void>. Brug den, når du ikke har brug for et resultat.
CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));Brugerdefineret Executor
Videregiv en brugerdefineret Executor for at styre den trådpulje, der bruges til beregningen — det er afgørende i webapps, hvor du vil undgå at blokere den fælles pulje.
ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
() -> userService.findById(42L), pool
);completedFuture: Allerede fuldført værdi
CompletableFuture.completedFuture(value) returnerer en allerede fuldført future. Det er nyttigt ved testning eller når du har en øjeblikkelig værdi, der skal returneres i en asynkron proceskæde.
CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediatelyFærdiggør en future manuelt
Brug complete() til at angive resultatet udefra, altså uden for beregningen. Brug completeExceptionally() til at signalere en fejl.
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() og join()
Både get() og join() blokerer, indtil futuren er fuldført. get() kaster kontrollerede undtagelser, mens join() pakker dem ind i den ukontrollerede 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() til kontrol uden blokering
getNow(defaultValue) returnerer resultatet, hvis futuren allerede er fuldført, eller den angivne standardværdi, hvis den ikke er — uden blokering og uden ventetid.
String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet doneisDone, isCancelled, isCompletedExceptionally
Kontrollér en futures tilstand uden at blokere. Kombinér disse kontroller i polling-løkker eller overvågningskode.
if (future.isDone()) System.out.println("Completed");
if (future.isCancelled()) System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");cancel() til håndtering af tidsudløb
Kald cancel(true) for at annullere en beregning, der er i gang. Futuren skifter til tilstanden annulleret, og enhver blokerende get() kaster 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) fuldfører automatisk futuren med en standardværdi, hvis den ikke er fuldført inden for tidsudløbet — mere elegant end manuel annullering.
CompletableFuture<String> result = fetchAsync()
.completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3sHurtigt tjek
Hvilken metode starter en asynkron beregning i den fælles ForkJoinPool og returnerer en værdi?
Opsummering
supplyAsync og runAsync starter asynkront arbejde. complete og completeExceptionally fuldfører manuelt. Brug join() til blokering uden kontrollerede undtagelser. completeOnTimeout håndterer tidsudløb på en enkel måde.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Oprettelse og færdiggørelse af CompletableFutures” gratis?
Ja — hele teksten til “Oprettelse og færdiggørelse af CompletableFutures” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Oprettelse og færdiggørelse af CompletableFutures”?
Brug supplyAsync, runAsync og completedFuture, og færdiggør futures manuelt med complete og completeExceptionally. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Oprettelse og færdiggørelse af CompletableFutures”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Oprettelse og færdiggørelse af CompletableFutures
- Kædning med thenApply og thenCompose
- Kombinering af futures: allOf og anyOf
- Fejlhåndtering og asynkron HTTP-pipeline