CompletableFuture中supplyAsync与thenApply
时间: 2024-07-12 08:01:16 浏览: 98
`CompletableFuture` 是Java 8引入的一个高级工具类,用于处理异步计算和并发操作。其中,`supplyAsync` 和 `thenApply` 是两个关键的方法,它们一起在处理异步任务中有重要作用。
**supplyAsync方法:**
`supplyAsync(Callable<T> task, Executor executor)` 方法用于异步执行一个任务。它接受一个 `Callable` 对象作为参数,这个对象会在给定的线程池(如果提供了)或默认线程池中被调用,返回值会被封装到一个新的 `CompletableFuture` 中。这使得代码可以在不阻塞主线程的情况下开始计算,提高了应用程序的响应性和并发性能。
举个例子:
```java
CompletableFuture.supplyAsync(() -> {
// 这里是一个耗时的操作
int result = doExpensiveComputation();
return result;
}, Executors.newSingleThreadExecutor())
.thenAccept(result -> {
// 处理结果
System.out.println("Result is " + result);
});
```
在这个例子中,`doExpensiveComputation()` 是一个耗时的操作,它不会阻塞主线程。
**thenApply方法:**
`thenApply(Function<T, U> after)`, 当前的 `CompletableFuture` 完成后,会应用提供的转换函数 (`after`) 到其结果上,并返回一个新的 `CompletableFuture`,新 `CompletableFuture` 的完成依赖于原 `CompletableFuture` 的完成。这样可以对原始的结果进行进一步处理,通常用于获取更复杂的数据结构或执行额外操作。
例如:
```java
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(str -> str.toUpperCase())
.thenAccept(System.out::println); // 输出 "HELLO"
```
这里,我们先获取一个字符串 "Hello",然后将其转换为大写并打印。
阅读全文