创建和完成 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 completedget() 与 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 doneisDone、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 反馈 — 无需本地设置。
此课程中的所有课时
- 创建和完成 CompletableFutures
- 使用 thenApply 和 thenCompose 链式处理
- 组合 Future:allOf 与 anyOf
- 错误处理与异步 HTTP 流水线