Java Academy · Lektion

Oprettelse og færdiggørelse af CompletableFutures

Brug supplyAsync, runAsync og completedFuture, og færdiggør futures manuelt med complete og completeExceptionally.

Lektion 1 af 413 trin

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 immediately

Fæ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 completed

get() 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 done

isDone, 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 > 3s

Hurtigt 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.

Gratis at komme i gang

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

  1. Oprettelse og færdiggørelse af CompletableFutures
  2. Kædning med thenApply og thenCompose
  3. Kombinering af futures: allOf og anyOf
  4. Fejlhåndtering og asynkron HTTP-pipeline
← Tilbage til Java Academy