介绍
CompletableFuture 是 Java 中用于异步编程的一个重要类,提供了一种方便的方式来处理异步任务。CompletableFuture.supplyAsync 和 CompletableFuture.runAsync 是 CompletableFuture 中的两个常用方法。它们都用于启动一个异步任务,但是它们之间也有一些差异。下面我们分别描述这两个方法。
CompletableFuture.supplyAsync
CompletableFuture.supplyAsync
用于执行一段需要有返回值的异步计算,它接收一个实现了 Supplier
接口的匿名函数作为参数,该函数会在另外一个线程中异步地执行。
Supplier
接口是一个函数式接口,它只有一个抽象方法 get()
,没有参数,返回一个指定类型的值。在 CompletableFuture.supplyAsync
中,使用该接口来执行异步计算并返回结果。例如:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 需要执行的异步任务代码
String result = "Hello World!";
return result;
});
// 获取异步任务的结果
String result = future.get();
其中,参数是一个 lambda 表达式,它实现了上面所述的 Supplier
接口的 get()
方法。这个 lambda 表达式将异步计算的结果“Hello World!”返回给调用者。CompletableFuture.supplyAsync
会在另外一个线程中执行这个任务,直到调用 get()
方法的线程得到了异步计算的结果。
CompletableFuture.runAsync
CompletableFuture.runAsync
与 CompletableFuture.supplyAsync
类似,但是前者没有返回值,其参数是实现了 Runnable
接口的匿名函数。Runnable
接口也是一个函数式接口,只有一个抽象方法 run()
,用于定义异步执行的任务代码。例如:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 需要执行的异步任务代码
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});
// 等待异步任务执行完成
future.join();
在 CompletableFuture.runAsync
中,同样通过匿名函数的方式来指定需要执行的异步任务,它使用 Runnable
接口来表示异步任务(上面的例子只是简单地输出一些数字)。需要注意的是,runAsync
方法返回类型是 CompletableFuture<Void>
,因为该方法并没有返回值。
总结
CompletableFuture.supplyAsync
和 CompletableFuture.runAsync
都是 CompletableFuture 中常用的方法,可以用于启动异步任务。CompletableFuture.supplyAsync
用于执行有返回值的异步计算,而 CompletableFuture.runAsync
则用于执行没有返回值的异步任务。可以通过实现相应的接口来编写需要执行的异步任务的代码,从而让 CompletableFuture 处理异步执行和获取结果的逻辑。