当前位置:首页 > Java

java 如何实现promise

2026-03-23 13:28:02Java

实现 Promise 的核心逻辑

Java 本身没有原生 Promise 类,但可以通过 CompletableFuture 或手动实现类似功能。以下是两种实现方式:

使用 CompletableFuture(推荐) Java 8 引入的 CompletableFuture 提供了类似 Promise 的链式调用和异步处理能力:

CompletableFuture.supplyAsync(() -> {
    // 模拟耗时操作
    return "Result";
}).thenApply(result -> {
    return result + " processed";
}).thenAccept(finalResult -> {
    System.out.println("Final result: " + finalResult);
}).exceptionally(ex -> {
    System.out.println("Error: " + ex.getMessage());
    return null;
});

手动实现 Promise 模式 若需更接近 JavaScript Promise 的 API,可自定义类:

public class Promise<T> {
    private T result;
    private Throwable error;
    private List<Consumer<T>> successCallbacks = new ArrayList<>();
    private List<Consumer<Throwable>> failureCallbacks = new ArrayList<>();

    public Promise(Supplier<T> task) {
        new Thread(() -> {
            try {
                this.result = task.get();
                successCallbacks.forEach(cb -> cb.accept(result));
            } catch (Exception e) {
                this.error = e;
                failureCallbacks.forEach(cb -> cb.accept(error));
            }
        }).start();
    }

    public Promise<T> then(Consumer<T> callback) {
        if (result != null) {
            callback.accept(result);
        } else {
            successCallbacks.add(callback);
        }
        return this;
    }

    public Promise<T> catchError(Consumer<Throwable> callback) {
        if (error != null) {
            callback.accept(error);
        } else {
            failureCallbacks.add(callback);
        }
        return this;
    }
}

关键特性对比

CompletableFuture 优势

  • 原生支持线程池配置
  • 提供 thenCombine/allOf 等组合操作
  • 内置异常处理机制

自定义 Promise 优势

java 如何实现promise

  • 更接近前端开发者的使用习惯
  • 可自由扩展 API(如 finally 方法)

异步执行示例

// 使用自定义 Promise
new Promise<String>(() -> {
    Thread.sleep(1000);
    return "Async Data";
}).then(data -> {
    System.out.println("Received: " + data);
}).catchError(e -> {
    System.err.println("Failed: " + e);
});

注意事项

  • 手动实现需处理线程安全(如回调列表的并发修改)
  • CompletableFuture 默认使用 ForkJoinPool,大量任务时建议指定自定义线程池
  • 复杂场景可结合 CompletionStage 接口实现更细粒度控制

两种方式都能实现核心的 Promise 模式,根据项目需求选择即可。现代 Java 项目通常优先使用 CompletableFuture

分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue如何实现两栏布局

vue如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <div…

如何使用java

如何使用java

安装Java开发环境 下载并安装Java Development Kit(JDK),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME指向JDK安装路径…

如何实现语音react

如何实现语音react

语音识别基础设置 在React中实现语音识别功能通常需要借助浏览器的Web Speech API或第三方库。Web Speech API提供了SpeechRecognition接口,允许应用程序直接访…

如何安装java环境

如何安装java环境

下载JDK安装包 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本(如Windows、macOS或Linux)。确保下载与系统架构匹配的版本(32位或64位)。 运行安…

java如何创建项目

java如何创建项目

使用IDE创建Java项目(以IntelliJ IDEA为例) 打开IntelliJ IDEA,选择“New Project”。 在左侧菜单中选择“Java”,确保已配置JDK(若无需手动添加)。 勾…