public static void main(String[] args) {
try {
CompletableFuture<List<ReqDto>> listCompletableFuture = processOrder();
List<ReqDto> reqDtoList = (List<ReqDto>) listCompletableFuture.get();
List<Long> longList = reqDtoList.stream().map(ReqDto::getId).collect(Collectors.toList());
System.out.println(StringUtils.join(longList, "、"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static CompletableFuture<List<ReqDto>> processOrder() {
List<Long> taskList = Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L);
Stream<CompletableFuture<ReqDto>> completableFutureStream = taskList.stream().map(num -> {
return CompletableFuture.supplyAsync(() -> func(num));
});
CompletableFuture[] completableFutures = completableFutureStream.toArray(CompletableFuture[]::new);
// // 并行启动三个异步任务,分别获取订单信息、用户信息和支付信息
// CompletableFuture<ReqDto> orderFuture = CompletableFuture.supplyAsync(() -> func(1L));
// CompletableFuture<ReqDto> userFuture = CompletableFuture.supplyAsync(() -> func(2L));
// CompletableFuture<ReqDto> paymentFuture = CompletableFuture.supplyAsync(() -> func(3L));
// 等待所有异步任务完成,并将结果封装到OrderDTO对象中
// return CompletableFuture.allOf(orderFuture, userFuture, paymentFuture)
CompletableFuture<List<ReqDto>> listCompletableFuture = CompletableFuture.allOf(completableFutures)
.thenApply(v -> {
List<ReqDto> dtoList = new ArrayList<>();
for (CompletableFuture completableFuture : completableFutures) {
dtoList.add((ReqDto) completableFuture.join());
}
// dtoList.add(orderFuture.join());
// dtoList.add(userFuture.join());
// dtoList.add(paymentFuture.join());
return dtoList;
});
listCompletableFuture.join();
// .whenComplete((aBoolean, throwable) -> System.out.println("处理结束"))
System.out.println("所有都执行完毕");
return listCompletableFuture;
}
public static ReqDto func(Long lo) {
System.out.println("lo=" + lo);
try {
if (lo.equals(2L)) {
throw new BusinessException("出现了2异常");
} else if (lo.equals(3L)) {
throw new RuntimeException("出现了3异常");
}
} catch (BusinessException e) {
} catch (RuntimeException e) {
}
ReqDto reqDto = new ReqDto();
reqDto.setId(lo);
return reqDto;
}
lo=2
lo=3
lo=1
lo=4
lo=5
lo=6
lo=7
lo=8
lo=9
lo=10
处理结束
1、2、3、4、5、6、7、8、9、10