如何使用Java CompletableFuture.allOf() 方法来并行处理多个线程任务,其中涉及到Budget对象的查询(包括新添加和现有预算),并在完成所有查询后进行聚合操作?Budget类有一个amount属性
时间: 2024-11-30 11:18:23 浏览: 24
在Java中,`CompletableFuture.allOf()` 方法可以用于同步一组异步任务,确保它们全部完成后才继续执行后续操作。假设我们有一个 `Budget` 类,每个预算查询都是一个独立的任务。我们可以创建一个包含所有查询 `Future` 对象的列表,然后使用 `allOf()` 来等待所有查询完成。
首先,我们需要定义一个方法来查询预算:
```java
class Budget {
private double amount;
// 添加查询方法
public CompletableFuture<Double> queryAmount(int id) {
// 这里是一个模拟数据库查询的异步操作
return CompletableFuture.supplyAsync(() -> {
// 查询逻辑,比如从数据库获取amount
return someDatabaseOperation(id);
});
}
// 省略其他方法...
private Double someDatabaseOperation(int id) {
// 实现具体的数据库查询
// ...
return amount;
}
}
```
接下来,我们可以创建一个方法来并发地执行查询并将结果收集到一起:
```java
List<CompletableFuture<Double>> budgetFutures = new ArrayList<>();
// 获取所有预算id,这里仅为示例
for (int id : budgetIds) {
budgetFutures.add(budget.queryAmount(id));
}
CompletableFuture<Void> allQueriesCompleted = CompletableFuture.allOf(budgetFutures.toArray(new CompletableFuture[0]));
allQueriesCompleted.thenAcceptVoid(() -> {
// 所有查询完成后,在这个回调中进行聚合操作
double totalAmount = budgetFutures.stream().mapToDouble(Double::doubleValue).sum();
System.out.println("Total budget amount: " + totalAmount);
});
```
在这个例子中,`allOf()` 方法会在所有budget查询都完成后执行回调函数,然后你可以对查询结果进行聚合计算。注意,你需要处理可能出现的异常,例如数据库连接失败等。
阅读全文