Java 异步请求接口的处理

在处理异步请求接口时,我们通常会遇到需要等待异步任务完成并获取结果的情况。在 Java 中,我们可以使用多种方式来处理异步请求,包括使用回调函数、使用 Future 和 CompletableFuture 等。本文将介绍这些处理异步请求的方法,并提供相应的代码示例。

1. 使用回调函数处理异步请求

回调函数是一种常用的处理异步请求的方式。回调函数是一个函数对象,用于在异步任务完成后被调用,并处理任务的结果。

以下是一个使用回调函数处理异步请求的示例代码:

public interface Callback<T> {
    void onSuccess(T result);
    void onFailure(Throwable throwable);
}

public class AsyncRequestClient {
    public void sendAsyncRequest(Callback<String> callback) {
        // 模拟异步请求
        new Thread(() -> {
            try {
                Thread.sleep(2000);
                callback.onSuccess("请求成功");
            } catch (InterruptedException e) {
                callback.onFailure(e);
            }
        }).start();
    }
}

public class Main {
    public static void main(String[] args) {
        AsyncRequestClient client = new AsyncRequestClient();
        
        client.sendAsyncRequest(new Callback<String>() {
            @Override
            public void onSuccess(String result) {
                System.out.println("请求结果:" + result);
            }
            
            @Override
            public void onFailure(Throwable throwable) {
                System.err.println("请求失败:" + throwable.getMessage());
            }
        });
        
        System.out.println("请求已发送");
    }
}

在上述代码中,AsyncRequestClient 类负责发送异步请求。它的 sendAsyncRequest 方法接受一个 Callback 对象作为参数,在请求完成后调用相应的回调方法。Main 类中的 main 方法演示了如何使用回调函数处理异步请求。首先,我们创建一个 AsyncRequestClient 对象,然后调用 sendAsyncRequest 方法并传入一个匿名内部类作为回调函数。

2. 使用 Future 处理异步请求

Java 提供了 Future 接口和 FutureTask 类来处理异步请求,它们可以用于获取异步任务的结果。

以下是一个使用 Future 处理异步请求的示例代码:

public class AsyncRequestTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 模拟异步请求
        Thread.sleep(2000);
        return "请求成功";
    }
}

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        AsyncRequestTask task = new AsyncRequestTask();
        
        Future<String> future = executorService.submit(task);
        
        System.out.println("请求已发送");
        
        String result = future.get();
        System.out.println("请求结果:" + result);
        
        executorService.shutdown();
    }
}

在上述代码中,我们创建了一个 AsyncRequestTask 类,它实现了 Callable 接口,负责执行异步请求。Main 类中的 main 方法演示了如何使用 Future 获取异步任务的结果。首先,我们创建一个 ExecutorService 对象来管理异步任务的执行。然后,我们创建一个 AsyncRequestTask 对象,并将其提交给 ExecutorServicesubmit 方法,该方法返回一个 Future 对象。通过调用 Future 对象的 get 方法,我们可以等待异步任务的完成,并获取任务的返回结果。

3. 使用 CompletableFuture 处理异步请求

Java 8 引入了 CompletableFuture 类来处理异步请求,它是对 Future 的增强,并提供了更多的操作方法。

以下是一个使用 CompletableFuture 处理异步请求的示例代码:

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
                return "请求成功";
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        
        System.out.println("请求已发送");
        
        future.thenAccept(result -> System.out.println("请求结果:" + result));
        
        Thread.sleep(3000); // 等待异步任务完成
        
        future.join(); // 等待异步任务完成,并获取结果
        
        CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future);
        allOfFuture.join(); // 等待多个异步任务完成
        
        CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(f