completablefuture和线程池
时间: 2023-04-29 08:03:02 浏览: 92
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引入的一种异步编程的工具类,用于处理异步任务的结果,它可以通过自定义线程池来实现更加精细化的控制。自定义线程池可以通过以下步骤实现:
1. 创建一个自定义的线程池对象,使用ThreadPoolExecutor类的构造函数进行创建,其中需要设置核心线程数、最大线程数、线程空闲时间等参数。
2. 将自定义线程池对象传入CompletableFuture对象的构造函数中,通过thenApplyAsync()、thenAcceptAsync()等方法指定该异步任务在该线程池中执行。
3. 可以使用shutdown()或shutdownNow()方法关闭线程池。