Future
和CompletableFuture
都是Java中用于表示异步计算结果的接口,但是它们之间有一些区别:
- 异步编程模型不同。 在使用
Future
时,我们通常需要使用ExecutorService
来提交异步任务,并使用Future
对象来获取计算结果。而在使用CompletableFuture
时,我们可以直接调用supplyAsync()
方法来提交异步任务,并使用CompletableFuture
对象进行链式操作,使得代码更加简洁和易读。 - 支持的操作不同。
Future
只支持获取计算结果的操作,而CompletableFuture
不仅支持获取计算结果,还支持更加丰富的操作,例如组合多个CompletableFuture
、处理异常、超时控制等。 - 并发性能不同。 在并发场景下,
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 } }
在这个示例中,我们使用CompletableFuture
的supplyAsync()
方法提交一个异步计算任务,然后使用thenApplyAsync()
方法对计算结果进行操作,最后输出操作后的结果。可以看到,使用CompletableFuture
可以非常方便地进行异步计算和操作,并且代码更加简洁和易读。