Java 9 为 CompletableFuture
引入了几个非常实用的新 API,旨在简化异步编程,提供更好的超时控制、错误处理和流式处理能力。这些新特性使得 CompletableFuture
的使用更加灵活和强大。
以下是 Java 9 中 CompletableFuture
的主要新 API 及其用法:
orTimeout(long timeout, TimeUnit unit)
功能:为 CompletableFuture
设置一个超时。如果在指定时间内 CompletableFuture
没有完成,它将以 TimeoutException
异常完成。
场景:当你调用一个可能长时间阻塞或无响应的异步任务时,可以使用此方法避免程序无限期等待。
示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class OrTimeoutExample {
public static void main(String[] args) {
// 模拟一个可能很慢的任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(5000); // 模拟耗时操作
return "任务完成";
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return "中断";
}
});
// 设置超时:如果2秒内未完成,则以 TimeoutException 失败
CompletableFuture<String> withTimeout = future.orTimeout(2, TimeUnit.SECONDS);
// 获取结果
try {
String result = withTimeout.get(); // 注意:这里使用 get() 仅用于演示,实际中应避免阻塞
System.out.println("结果: " + result);
} catch (Exception e) {
System.out.println("发生异常: " + e.getCause().getMessage()); // 输出: java.util.concurrent.TimeoutException
}
}
}
SHARE.010JIU.COM75丨PRETTY.ZTKYSZGS.COM28丨FZB.BOTIANQI.COM87丨24K.SIII.ORG.CN55
24K.CLQMW.COM39丨JSLYDQGS.COM37丨WEIBO.BTJZ.NET.CN69丨SAISHI.DGRYMY.CN34
ZHIBO.YLDF120.COM46丨WWW.KIN168.CN93丨VIP.FAI618.COM23丨IQIYI.KEYUQZJX.COM72
LIVE.PSAZDZZ.COM75丨MAP.BMXXW.NET27丨ZUQIU.GZBYJULEBU.COM32丨ONLINE.SWZNXY.COM57
BOLL.GCYMGS.CN60丨SAISHI.HONGDA0536.CN13丨MOBI.YIYUANJINGPIN.COM73丨SINA.10ZHANPAI.COM80
SUCHAO.HECHENGTAOLI.COM29丨SJB.178ZB.MOBI84丨LIVE.NMFZTD.ORG.CN32丨MAP.ZZZ-Z.CN87
FREE.10ZHANPAI.COM96丨ZBSJB.JIAOFEIYI.NET79丨SHARE.CHANGTAI333.COM47丨WAP.LYSCK.COM60
SOHU.GDYUSAN.CN32丨MAP.JXYBGC.COM25丨FOOTBALL.ENDYEDU.COM90丨CCTV.QIRUI4.COM62
WWW.SHOA01.COM84丨SJB.DGBLJZ.COM84丨WAP.HZSMC.COM17丨ONLINE.FJFYW.NET94
WWW.BOTIANQI.COM64丨SWEET.QQRJ.CN53丨24K.SWZNXY.COM13丨SAISHI.JNSDPMJ.COM36
M.QZSYHB.CN21丨FREE.DGBLJZ.COM92丨OUGUAN.PYACKQ.COM37丨VIP.GANGGUANW.ORG29
VIP.JING-KE.COM89丨WWW.SJYUAN.CN17丨WEIBO.92ZHIBO.CN26丨LN.CDIPD.COM11
completeOnTimeout(T value, long timeout, TimeUnit unit)
功能:为 CompletableFuture
设置一个超时。如果在指定时间内 CompletableFuture
没有完成,它将以给定的默认值成功完成。
场景:当异步任务超时后,你希望返回一个默认值或兜底结果,而不是让整个流程失败。
示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompleteOnTimeoutExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(5000);
return "任务完成";
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return "中断";
}
});
// 设置超时:如果2秒内未完成,则以 "超时默认值" 成功完成
CompletableFuture<String> withDefault = future.completeOnTimeout("超时默认值", 2, TimeUnit.SECONDS);
try {
String result = withDefault.get();
System.out.println("结果: " + result); // 输出: 超时默认值
} catch (Exception e) {
e.printStackTrace();
}
}
}
对比
orTimeout
和completeOnTimeout
:
orTimeout
: 超时 → 异常完成。completeOnTimeout
: 超时 → 正常完成(带默认值)。Executor delayedExecutor(long delay, TimeUnit unit)
功能:这是一个静态方法,用于创建一个延迟执行的 Executor
。这个 Executor
会在指定的延迟后,才开始执行提交给它的任务。
场景:需要延迟执行某个异步任务。
示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
public class DelayedExecutorExample {
public static void main(String[] args) {
// 创建一个延迟2秒的 Executor
Executor delayedExecutor = CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS);
// 使用这个延迟的 Executor 提交任务
CompletableFuture<String> delayedFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("任务在延迟后执行");
return "延迟任务完成";
}, delayedExecutor);
// 主线程等待一下,观察输出
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
// 输出:
// (等待2秒)
// 任务在延迟后执行
Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
功能:这是 delayedExecutor
的重载版本。它创建一个延迟执行的 Executor
,但实际的任务执行委托给另一个指定的 Executor
(如线程池)。
场景:你需要延迟执行任务,并且希望任务在特定的线程池中运行。
示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
public class DelayedExecutorWithPoolExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池
Executor customExecutor = Executors.newFixedThreadPool(2);
// 创建一个延迟3秒的 Executor,并使用 customExecutor 执行任务
Executor delayedExecutor = CompletableFuture.delayedExecutor(3, TimeUnit.SECONDS, customExecutor);
CompletableFuture.runAsync(() -> {
System.out.println("任务在延迟后,在自定义线程池中执行");
}, delayedExecutor);
// 主线程等待
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 关闭线程池
((java.util.concurrent.ThreadPoolExecutor) customExecutor).shutdown();
}
}
// 输出:
// (等待3秒)
// 任务在延迟后,在自定义线程池中执行
minimalCompletionStage()
和 completeAsync(CompletionStage<? extends T> stage)
这两个 API 是为了更好地与 CompletionStage
接口进行互操作而设计的。
minimalCompletionStage()
:
CompletionStage
视图,该视图仅暴露 CompletionStage
定义的方法。CompletableFuture
作为 CompletionStage
对象传递给其他代码时,可以防止接收方调用 CompletableFuture
特有的方法(如 complete()
、cancel()
),从而实现更好的封装和安全性。completeAsync(CompletionStage<? extends T> stage)
:
CompletableFuture
异步地完成,其结果或异常与给定的 CompletionStage
相同。CompletableFuture
会等待 stage
完成,然后以相同的结果或异常状态完成自己。示例 (completeAsync
):
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
public class CompleteAsyncExample {
public static void main(String[] args) {
// 创建一个源 CompletionStage
CompletionStage<String> sourceStage = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "源结果";
});
// 创建一个目标 CompletableFuture
CompletableFuture<String> targetFuture = new CompletableFuture<>();
// 让 targetFuture 异步地完成,结果与 sourceStage 相同
targetFuture.completeAsync(sourceStage);
// 现在 targetFuture 的行为将与 sourceStage 保持一致
targetFuture.thenAccept(result -> System.out.println("目标完成: " + result));
}
}
// 输出:
// (等待2秒)
// 目标完成: 源结果
API | 功能 | 主要用途 |
---|---|---|
orTimeout(...) | 超时后以 TimeoutException 失败 | 防止无限等待,实现熔断 |
completeOnTimeout(...) | 超时后以默认值成功 | 实现降级,提供兜底方案 |
delayedExecutor(...) | 创建延迟执行的 Executor | 延迟执行任务 |
delayedExecutor(..., executor) | 创建延迟执行的 Executor 并指定执行线程池 | 精确控制延迟任务的执行环境 |
minimalCompletionStage() | 返回 CompletionStage 安全视图 | 封装,防止外部修改 |
completeAsync(CompletionStage) | 异步地以另一个 CompletionStage 的结果完成自己 | 桥接异步操作,实现组合 |
这些新 API 极大地增强了 CompletableFuture
在处理超时、延迟和错误恢复方面的能力,使得编写健壮、响应式的异步 Java 应用变得更加容易。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。