0Pricing
Java Academy · 课时

创建和完成 CompletableFutures

使用 supplyAsync、runAsync 和 completedFuture,并通过 complete 和 completeExceptionally 手动完成 Future

创建和完成 CompletableFutures 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

什么是 CompletableFuture?

CompletableFuture<T>(Java 8+)表示一种异步计算,可以显式完成、串联和组合。它同时实现了 Future 和 CompletionStage。

supplyAsync:启动异步计算

CompletableFuture.supplyAsync() 会在公共 ForkJoinPool 中运行一个 Supplier,并返回一个包含计算结果的 future。

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

runAsync:执行后不关心结果

runAsync() 会异步运行一个 Runnable,并返回 CompletableFuture<Void>。当您不需要结果时,可以使用它。

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

自定义执行器

请传入自定义 Executor,以控制计算所使用的线程池。在希望避免阻塞公共线程池的 Web 应用中,这一点非常重要。

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

completedFuture:已完成的值

CompletableFuture.completedFuture(value) 会返回一个已经完成的 future。在测试中,或者需要在异步流程中返回立即可用的值时,它非常有用。

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

手动完成 Future

请使用 complete() 从计算外部提供结果。请使用 completeExceptionally() 表示失败。

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() 与 join()

get() 和 join() 都会阻塞,直到 future 完成。get() 会抛出受检异常;join() 会将它们包装在非受检的 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() 进行非阻塞检查

如果已经完成,getNow(defaultValue) 会返回结果;如果尚未完成,则返回所提供的默认值。此操作不会阻塞,也不会等待。

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

isDone、isCancelled、isCompletedExceptionally

无需阻塞即可检查 future 的状态。您可以在轮询循环或监控代码中组合使用这些检查。

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

使用 cancel() 处理超时

请调用 cancel(true) 取消正在进行的计算。future 会转换为已取消状态,任何阻塞中的 get() 都会抛出 CancellationException。

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

completeOnTimeout(Java 9+)

如果 future 未能在超时时间内完成,completeOnTimeout(value, timeout, unit) 会自动使用默认值完成它。与手动取消相比,这种方式更加简洁。

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

快速检查

哪个方法会在公共 ForkJoinPool 中启动异步计算并返回一个值?

回顾

supplyAsync / runAsync 会启动异步工作。complete / completeExceptionally 用于手动完成。需要进行非受检阻塞时,请使用 join()。completeOnTimeout 可以简洁地处理超时。

常见问题解答

「创建和完成 CompletableFutures」课时是免费的吗?

是的 — 「创建和完成 CompletableFutures」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「创建和完成 CompletableFutures」这节课中我会学到什么?

使用 supplyAsync、runAsync 和 completedFuture,并通过 complete 和 completeExceptionally 手动完成 Future 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「创建和完成 CompletableFutures」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建和完成 CompletableFutures
  2. 使用 thenApply 和 thenCompose 链式处理
  3. 组合 Future:allOf 与 anyOf
  4. 错误处理与异步 HTTP 流水线
← 返回 Java Academy