首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java9新特性之CompletableFuture的新API

java9新特性之CompletableFuture的新API

原创
作者头像
技术文章分析
发布2025-09-21 15:01:14
发布2025-09-21 15:01:14
200
代码可运行
举报
文章被收录于专栏:技术技术
运行总次数:0
代码可运行

Java 9 为 CompletableFuture 引入了几个非常实用的新 API,旨在简化异步编程,提供更好的超时控制、错误处理和流式处理能力。这些新特性使得 CompletableFuture 的使用更加灵活和强大。

以下是 Java 9 中 CompletableFuture 的主要新 API 及其用法:


1. orTimeout(long timeout, TimeUnit unit)

功能:为 CompletableFuture 设置一个超时。如果在指定时间内 CompletableFuture 没有完成,它将TimeoutException 异常完成

场景:当你调用一个可能长时间阻塞或无响应的异步任务时,可以使用此方法避免程序无限期等待。

示例

代码语言:javascript
代码运行次数:0
运行
复制
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

2. completeOnTimeout(T value, long timeout, TimeUnit unit)

功能:为 CompletableFuture 设置一个超时。如果在指定时间内 CompletableFuture 没有完成,它将以给定的默认值成功完成

场景:当异步任务超时后,你希望返回一个默认值或兜底结果,而不是让整个流程失败。

示例

代码语言:javascript
代码运行次数:0
运行
复制
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();
        }
    }
}

对比 orTimeoutcompleteOnTimeout

  • orTimeout: 超时 → 异常完成
  • completeOnTimeout: 超时 → 正常完成(带默认值)。

3. Executor delayedExecutor(long delay, TimeUnit unit)

功能:这是一个静态方法,用于创建一个延迟执行的 Executor。这个 Executor 会在指定的延迟后,才开始执行提交给它的任务。

场景:需要延迟执行某个异步任务。

示例

代码语言:javascript
代码运行次数:0
运行
复制
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秒)
// 任务在延迟后执行

4. Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)

功能:这是 delayedExecutor 的重载版本。它创建一个延迟执行的 Executor,但实际的任务执行委托给另一个指定的 Executor(如线程池)。

场景:你需要延迟执行任务,并且希望任务在特定的线程池中运行。

示例

代码语言:javascript
代码运行次数:0
运行
复制
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秒)
// 任务在延迟后,在自定义线程池中执行

5. 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):

代码语言:javascript
代码运行次数:0
运行
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. orTimeout(long timeout, TimeUnit unit)
  • 2. completeOnTimeout(T value, long timeout, TimeUnit unit)
  • 3. Executor delayedExecutor(long delay, TimeUnit unit)
  • 4. Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
  • 5. minimalCompletionStage() 和 completeAsync(CompletionStage<? extends T> stage)
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档