CompletableFuture 使用
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @Author: TrueNewBee
* @Date: 2023/8/28 23:05
* @Github: https://github.com/TrueNewBee
* @Description: 通过 CompletableFuture 解决多个查询语句,并把所查询解决汇总封装成一条数据的痛点问题
*/
public class Test2 {
public static void main(String[] args) {
// 模拟传来的10个卡号
List<String> cardNumbers = Arrays.asList("1234567890", "2345678901", "3456789012", "4567890123", "5678901234",
"6789012345", "7890123456", "8901234567", "9012345678", "0123456789");
// 一只数据库DAO会返回一个list,所以个list对象,所以先写伪代码,具体根据业务来
List<CompletableFuture<String>> futures = new ArrayList<>();
// 这里可以是一个 tra对象/ 一些查询参数,具体按业务来
for (String cardNumber : cardNumbers) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 在这里执行数据库查询操作,并返回查询结果
// 这里只是模拟查询操作,实际需要根据具体的数据库操作进行实现
//return query(xx,xx,xx,xx)
return "Query result for card number: " + cardNumber;
});
futures.add(future);
}
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try {
allFutures.get(); // 等待所有查询操作完成
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
List<String> results = new ArrayList<>();
// 由于查询结果本来就是一个list ,直接追加即可
// 可以根据需求去修改下
for (CompletableFuture<String> future : futures) {
try {
String result = future.get(); // 获取每个查询操作的结果
results.add(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
System.out.println("Query results:");
for (String result : results) {
System.out.println(result);
}
}
}
在上面的代码中,我们首先定义了一个包含10个卡号的列表cardNumbers
。然后,我们创建了一个CompletableFuture
的列表futures
,用于保存每个查询操作的CompletableFuture
对象。
在循环中,我们为每个卡号创建一个CompletableFuture
对象,并在其supplyAsync
方法中执行数据库查询操作。这里只是简单地返回了一个带有卡号的查询结果的字符串,你需要根据具体的数据库操作进行实现。
将每个CompletableFuture
对象添加到futures
列表中后,我们使用CompletableFuture.allOf
方法创建了一个新的CompletableFuture
对象allFutures
,用于等待所有查询操作完成。
然后,我们使用allFutures.get()
方法来等待所有查询操作完成。在这之后,我们遍历每个CompletableFuture
对象,使用get()
方法获取每个查询操作的结果,并将结果添加到results
列表中。
最后,我们打印出所有查询结果。你可以根据实际需求对结果进行进一步处理。