ZPY博客

Java中Future和CompletableFuture有什么区别?

FutureCompletableFuture都是Java中用于表示异步计算结果的接口,但是它们之间有一些区别:

  1. 异步编程模型不同。 在使用Future时,我们通常需要使用ExecutorService来提交异步任务,并使用Future对象来获取计算结果。而在使用CompletableFuture时,我们可以直接调用supplyAsync()方法来提交异步任务,并使用CompletableFuture对象进行链式操作,使得代码更加简洁和易读。
  2. 支持的操作不同。 Future只支持获取计算结果的操作,而CompletableFuture不仅支持获取计算结果,还支持更加丰富的操作,例如组合多个CompletableFuture、处理异常、超时控制等。
  3. 并发性能不同。 在并发场景下,CompletableFuture通常比Future的性能更好,因为CompletableFuture可以利用异步非阻塞的方式来完成任务,而Future则需要使用阻塞式的方式等待计算结果。

下面是一个使用CompletableFuture的简单示例代码,演示了如何使用CompletableFuture进行异步计算和操作:

public class CompletableFutureExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            // 执行异步计算任务
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 42;
        });

        // 使用 thenApply() 对计算结果进行操作
        CompletableFuture<String> future2 = future.thenApplyAsync(result -> {
            // 对计算结果进行转换操作
            return "结果是:" + result;
        });

        System.out.println(future2.get()); // 输出结果是:42

    }
}

在这个示例中,我们使用CompletableFuturesupplyAsync()方法提交一个异步计算任务,然后使用thenApplyAsync()方法对计算结果进行操作,最后输出操作后的结果。可以看到,使用CompletableFuture可以非常方便地进行异步计算和操作,并且代码更加简洁和易读。