当前位置:首页 > Java

java如何实现promise

2026-03-22 12:10:12Java

Java 实现 Promise 的方法

在 Java 中,虽然没有原生支持 JavaScript 中的 Promise,但可以通过以下方式实现类似功能:

使用 CompletableFuture(Java 8+)

CompletableFuture 是 Java 8 引入的异步编程工具,功能与 Promise 类似:

CompletableFuture<String> promise = CompletableFuture.supplyAsync(() -> {
    // 异步任务
    return "Result";
});

promise.thenApply(result -> {
    // 处理结果
    System.out.println(result);
    return result + " processed";
}).thenAccept(finalResult -> {
    // 最终处理
    System.out.println(finalResult);
});

手动实现 Promise 模式

可以创建一个简单的 Promise 类:

import java.util.concurrent.*;
import java.util.function.*;

public class Promise<T> {
    private T result;
    private Exception error;
    private boolean isCompleted;
    private Consumer<T> successCallback;
    private Consumer<Exception> failureCallback;

    public void complete(T result) {
        this.result = result;
        this.isCompleted = true;
        if (successCallback != null) {
            successCallback.accept(result);
        }
    }

    public void fail(Exception error) {
        this.error = error;
        this.isCompleted = true;
        if (failureCallback != null) {
            failureCallback.accept(error);
        }
    }

    public Promise<T> then(Consumer<T> callback) {
        if (isCompleted && error == null) {
            callback.accept(result);
        } else {
            this.successCallback = callback;
        }
        return this;
    }

    public Promise<T> error(Consumer<Exception> callback) {
        if (isCompleted && error != null) {
            callback.accept(error);
        } else {
            this.failureCallback = callback;
        }
        return this;
    }
}

使用第三方库

一些第三方库提供了更接近 JavaScript Promise 的实现:

  1. Guava 的 ListenableFuture:
    
    ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
    ListenableFuture<String> future = service.submit(() -> "Result");

Futures.addCallback(future, new FutureCallback() { public void onSuccess(String result) { System.out.println(result); } public void onFailure(Throwable t) { t.printStackTrace(); } }, service);


2. RxJava:
```java
Single<String> promise = Single.fromCallable(() -> "Result");
promise.subscribe(
    result -> System.out.println(result),
    error -> error.printStackTrace()
);

异步执行与回调

对于简单的异步操作,可以使用 ExecutorService:

java如何实现promise

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
    Thread.sleep(1000);
    return "Async result";
});

try {
    String result = future.get(); // 阻塞获取结果
    System.out.println(result);
} catch (Exception e) {
    e.printStackTrace();
}

选择哪种方法取决于具体需求。CompletableFuture 是 Java 原生支持且功能强大的选择,而手动实现或第三方库可以提供更接近 JavaScript Promise 的体验。

分享给朋友:

相关文章

vue如何实现原理

vue如何实现原理

Vue 的核心实现原理 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化。以下分模块详细说明其实现机制。 响应式系统 Vue 2.x 使用 Object.defineProper…

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scale…

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…

如何搭建java开发环境

如何搭建java开发环境

下载并安装JDK 从Oracle官网或OpenJDK下载适合操作系统的JDK版本。运行安装程序并按照提示完成安装,建议选择默认路径以减少配置复杂度。 配置环境变量 在系统环境变量中添加JAVA_HO…

vue如何实现轮播

vue如何实现轮播

使用 Vue 实现轮播 使用第三方库(推荐) Vue 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper。以下是使用 vue-awesome-swiper 的示…

java如何入门

java如何入门

学习基础语法 从Java的基础语法开始,包括变量、数据类型、运算符、控制结构(if-else、for循环、while循环)等。可以通过官方文档或入门教程学习。 安装开发环境 下载并安装JDK(J…