现代软件开发中,同时处理多个任务的能力变得越来越重要。异步编程是实现这一目标的关键技术,它允许程序在等待长时间运行的任务完成时继续执行。
CompletableFuture 是什么?
CompletableFuture是Java 8中引入的一个类,是对Future接口的增强,Future表示一个异步计算的结果,而CompletableFuture则提供了更多的操作和灵活性。CompletableFuture可以用于编写异步任务的执行流程,可以通过链式调用来组合多个异步操作,实现更复杂的异步处理逻辑。
要创建CompletableFuture,可以使用Completable未来类中的静态工厂方法。例如,要创建返回字符串的CompletableFuture,我们可以使用以下代码:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 一些需要长时间执行的代码
return "result";
});
这段代码创建了一个CompletableFuture,异步执行完成时返回字符串结果。
当CompletableFuture完成时,可以使用get方法检索其结果,但是调用get方法会阻塞当前线程,直到返回结果为止。更好的方法是使用thenAccept方法,它允许指定一个回调函数,在不阻塞线程的方式返回结果。
使用thenAccept方法打印CompletableFuture的结果:
public CompletableFuture<Integer> externalApiCall() {
return CompletableFuture.supplyAsync(() -> {
int val = new Random().nextInt(100);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return val;
});
}
externalApiCall()
.thenAccept(val -> System.out.println("Returned result: " + val));
还可以将多个CompletableFutures连接在一起,以执行一系列的异步任务。
当一个CompletableFuture完成时,可以使用它的结果来启动下一个ComplextableFuture。
使用thenCompe或thenCombine方法来链接CompletableFutures
public CompletableFuture<Integer> externalApiCall() {
return CompletableFuture.supplyAsync(() -> {
int val = new Random().nextInt(100);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return val;
});
}
externalApiCall()
// 使用thenCompose将Integer转换为String
.thenCompose(val -> CompletableFuture.completedFuture(String.valueOf(val)))
.thenAccept(val -> System.out.println("Returned Value: " + val));
externalApiCall()
.thenCombine(externalApiCall(), Integer::sum)
.thenAccept(val -> System.out.println("Returned Value: " + val));
CompletableFuture还提供了几种方法来处理异步任务执行过程中可能发生的异常,可以使用exception方法来指定在发生异常时的回调函数。还可以使用handle方法指定一个回调函数,无论CompletableFuture是否正常完成,都会调用该函数。
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
// 一些长时间运行的计算可能引发异常
throw new RuntimeException("exception");
});
future.exceptionally(ex -> {
System.out.println("Exception: " + ex.getMessage());
return 0;
});
future.thenAccept(result -> System.out.println("Result: " + result);
更多使用说明:
https://www.apiref.com/java11-zh/java.base/java/util/concurrent/CompletableFuture.html