使用CompletableFuture和线程池 查询30万数据 并放入list集合
时间: 2023-10-19 19:20:12 浏览: 91
使用`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()`方法,关闭线程池。
阅读全文