ExecutorService executor = new ThreadPoolExecutor(
8, 16, 60,
TimeUnit.MINUTES,
new ArrayBlockingQueue<>(100)
);
Random random=new Random(10);
//模拟查询用户列表
List<User> list=selectUsers();//需要执行的任务列表
// 任务列表
List<CompletableFuture<User>> fList = new ArrayList<>();
list.forEach(u->{
CompletableFuture<User> f = CompletableFuture.supplyAsync(//异步执行方法
//执行耗时较长的业务代码,这里模拟一下
()->{
//执行完成,设置返回结果 设置 coede 和 list
u.setAge(random.nextInt(100));
u.setName(UUID.randomUUID().toString());
return u;
},
executor
);
fList.add(f);
});
// 阻塞,等待所有任务执行完成
CompletableFuture<Void> all= CompletableFuture.allOf(fList.toArray(new CompletableFuture[0]));
//因为allOf没有返回值,所以需要通过thenApply回调函数获取结果
CompletableFuture<List<User>> allUser=all.thenApply(v-> fList.stream().map(a-> {
try {
return a.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList()));
// ---------------获取返回值-----------------
try {
list=allUser.get();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
CompletableFuture 异步调用,获取返回值
Cyclic10012023-11-03 9:51
相关推荐
这周也會开心18 小时前
单元测试总结2范纹杉想快点毕业18 小时前
数据结构与算法个人学习代码笔记包含leetcode,海贼oj,蓝桥杯,ACM资源开发与学习18 小时前
【10章】Java大模型工程能力必修课,LangChain4j 入门到实践YDS82918 小时前
SpringMVC —— Spring集成web环境和SpringMVC快速入门##学无止境##18 小时前
Kafka:Java开发的消息神器,你真的懂了吗?mask哥19 小时前
详解kafka streams(二)bjzw19 小时前
Kafka实际应用场景,总结原理,使用Kafka注意问题,Kafka应用场景浮游本尊19 小时前
Java学习第18天 - Kafka消息队列与流式处理wdfk_prog19 小时前
[Linux]学习笔记系列 -- mm/slub.c SLUB内存分配器(The SLUB Allocator) 现代内核对象缓存的核心华仔啊19 小时前
前后端为个下拉框又吵起来了?一招优雅的 Java 枚举解法,让团队和谐开发!