多个CompletableFuture 异步执行任务,并对多个CompletableFuture的结果生成进度条
时间: 2023-11-25 12:50:26 浏览: 184
以下是Java中使用多个CompletableFuture异步执行任务,并对多个CompletableFuture的结果生成进度条的示例代码:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建多个CompletableFuture对象
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 2;
});
CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 3;
});
// 将多个CompletableFuture对象添加到List中
List<CompletableFuture<Integer>> futures = new ArrayList<>();
futures.add(future1);
futures.add(future2);
futures.add(future3);
// 使用CompletableFuture.allOf()方法等待所有CompletableFuture执行完毕
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
// 计算总进度
int totalProgress = futures.stream().mapToInt(future -> future.join()).sum();
// 打印总进度
System.out.println("Total progress: " + totalProgress);
// 生成进度条
while (!allFutures.isDone()) {
int completed = (int) futures.stream().filter(CompletableFuture::isDone).count();
int progress = futures.stream().filter(CompletableFuture::isDone).mapToInt(CompletableFuture::join).sum();
System.out.printf("Progress: [%d/%d]\n", progress, totalProgress);
Thread.sleep(500);
}
}
}
```
在上述代码中,我们首先创建了三个CompletableFuture对象,每个对象都模拟了一个耗时操作,并返回一个整数结果。然后,我们将这三个CompletableFuture对象添加到一个List中,并使用CompletableFuture.allOf()方法等待所有CompletableFuture执行完毕。接着,我们计算了所有CompletableFuture的结果之和,作为总进度。最后,我们使用一个while循环生成进度条,直到所有CompletableFuture执行完毕。在循环中,我们使用filter()方法过滤出已经完成的CompletableFuture对象,并计算它们的结果之和,作为当前进度。然后,我们打印当前进度,并使用Thread.sleep()方法暂停500毫秒,以便观察进度条的变化。
阅读全文