completablefuture和线程池
时间: 2023-04-29 08:03:02 浏览: 218
CompletableFuture是Java 8中新增的一个类,用于异步编程和函数式编程。它可以让我们更方便地处理异步任务的结果,避免了回调地狱的问题。同时,它也提供了一些方法来处理多个异步任务的结果,如allOf()和anyOf()。
线程池是Java中用于管理线程的机制。它可以让我们更好地控制线程的数量和生命周期,避免了频繁地创建和销毁线程的开销。通过线程池,我们可以将任务提交到线程池中,由线程池来管理线程的执行。线程池还可以提供一些配置选项,如线程数量、线程池类型等,以满足不同的需求。
相关问题
使用CompletableFuture和线程池 查询30万数据 并放入list集合
使用`CompletableFuture`和线程池同样可以实现这个需求。以下是一个示例代码:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
public class CompletableFutureDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 模拟数据查询,返回一个 List
List<String> data = new ArrayList<>();
for (int i = 0; i < 300000; i++) {
data.add("data_" + i);
}
// 创建一个线程池,线程数为 10
ExecutorService executor = Executors.newFixedThreadPool(10);
// 分成 10 个线程并行处理数据
int threadNum = 10;
int dataSizePerThread = data.size() / threadNum;
List<CompletableFuture<List<String>>> futures = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
int startIndex = i * dataSizePerThread;
int endIndex = (i == threadNum - 1) ? data.size() : (i + 1) * dataSizePerThread;
List<String> subList = data.subList(startIndex, endIndex);
CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
List<String> result = new ArrayList<>();
for (String item : subList) {
// 查询数据的代码
result.add(item);
}
return result;
}, executor);
futures.add(future);
}
// 等待所有线程执行完毕
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
allFutures.join();
// 合并结果
List<String> result = futures.stream()
.flatMap(future -> future.join().stream())
.collect(Collectors.toList());
// 输出结果
System.out.println(result.size());
// 关闭线程池
executor.shutdown();
}
}
```
上述代码中,首先模拟了一份数据,然后创建了一个线程池,线程数为 10。然后将这份数据分成了 10 个子集,分别由 10 个线程并行处理。每个子集的处理过程,都被封装成了一个 `CompletableFuture` 对象,并添加到了 `futures` 列表中。在创建`CompletableFuture`对象时,指定了线程池作为执行器。然后使用 `CompletableFuture.allOf` 方法等待所有线程执行完毕,最后将所有线程的结果合并成一个列表并输出。
需要注意的是,这里的查询数据的代码,需要根据具体的业务逻辑进行实现,上述代码中只是简单地将数据添加到结果列表中。同时,在程序结束时,需要调用线程池的`shutdown()`方法,关闭线程池。
completablefuture与线程池
`CompletableFuture`是Java 8引入的一个强大的工具类,它代表了一个异步计算的结果。它不仅仅是一个普通的Future对象,还提供了一套完整的API来处理异步操作的复杂场景,如并行、串行、回退值、异常处理等。
线程池是一种用于并发执行任务的机制,它预先创建一定数量的工作线程,并按照一定的策略管理和调度这些线程。通过线程池,我们可以避免频繁地创建和销毁线程,提高程序的性能和资源利用率。
`CompletableFuture`与线程池通常结合使用,例如:
1. **提交任务到线程池**:可以将包含`CompletableFuture`的函数提交给线程池,当线程完成任务时,未来(Future)的状态会更新。
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture<Void> future = executor.submit(() -> {
// 执行耗时操作...
});
```
2. **链式调用和同步**:`thenApply`, `thenAccept`, `thenCompose`等方法可以在计算完成后立即执行后续步骤,这种方式利用了线程池的并行能力,同时又保持了顺序性。
3. **错误处理**:如果任务抛出异常,`CompletableFuture`可以捕获这个异常并通过回调传递给调用者,而无需手动管理线程。
阅读全文