当前位置:首页 > Java

java 如何实现promise

2026-03-23 13:28:02Java

实现 Promise 的核心逻辑

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

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

java 如何实现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,可自定义类:

java 如何实现promise

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 优势

  • 更接近前端开发者的使用习惯
  • 可自由扩展 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

分享给朋友:

相关文章

java如何创建文件

java如何创建文件

使用 File 类创建文件 通过 File 类的 createNewFile() 方法创建文件。此方法返回布尔值,表示文件是否成功创建。 import java.io.File; import ja…

如何使用java

如何使用java

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

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件…

vue项目如何实现

vue项目如何实现

安装Vue.js 通过npm或yarn安装Vue.js。确保Node.js环境已配置完成。 npm install vue # 或 yarn add vue 创建Vue项目 使用Vue CLI工具快…

如何卸载java

如何卸载java

卸载Java的步骤 Windows系统卸载方法 打开控制面板,选择“程序和功能”或“卸载程序”。在列表中找到Java相关条目(如“Java 8 Update 251”),右键选择卸载并跟随向导完成操…

如何运行java文件

如何运行java文件

运行Java文件的方法 确保已安装Java Development Kit (JDK),可通过命令行输入java -version和javac -version验证安装。 编写Java代码并保存为.…