Java CompletableFuture 怎么用
生活里你肯定遇过这种场景:早上同时用手机点外卖、同步查快递、还得给同事发工作消息,要是一件一件做,等外卖的功夫都能把活儿干完了。那有没有办法“同时处理好几件事,还能把结果凑到一块儿用”?Java里的CompletableFuture,就是帮你干这个的工具。
---

先搞懂:它到底是啥?
咱们用“攒快递”打比方:你把要收的3个快递,分别给楼下便利店的3个老板代取,老板们各自去取,不用你盯着;等所有快递都取回来了,你再一次性去便利店拿,还能顺便挑个最大的盒子装。
CompletableFuture就是这个“代取快递的工具”:你给它派任务(让“老板”干活),它能让任务同时跑,还能等所有任务干完,把结果汇总给你。
---
最基础用法:单任务“异步跑”
先看最简单的:比如你想让电脑“后台帮你算1到100万的和”,不用自己盯着,去干别的事,结果算完它会告诉你。
要是用老办法,得写个循环慢慢算,占着CPU没法干别的;用CompletableFuture的话,就是这么写:
`java
// 派任务:让另一个线程(后台)算1到100万的和
CompletableFuture<Long> sumTask = CompletableFuture.supplyAsync(() -> {
long sum = 0;
for (int i = 1; i <= 1000000; i++) {
sum += i;
}
return sum; // 任务干完,返回结果
});
// 你去干别的事(这里模拟写代码,随便写点日志)
System.out.println("我先写10行代码再说!");
// 等任务干完,拿结果用
long result = sumTask.get();
System.out.println("算完啦!1到100万的和是" + result);
`
是不是像给老板派活?你不用等他取快递,先干自己的,他取完了喊你拿就行。
---
进阶用法:多任务“一起跑,汇总结果”
要是你有3个快递要取:快递1在小区门口、快递2在地铁站、快递3在公司,这时候让3个老板同时去取,比一个个跑快多了。
用CompletableFuture的allOf方法,就能把多个任务凑成一个大任务,等所有都干完再汇总:
`java
// 派3个取快递的任务,分别对应3个地点
CompletableFuture<String> express1 = CompletableFuture.supplyAsync(() -> "小区门口取的快递");
CompletableFuture<String> express2 = CompletableFuture.supplyAsync(() -> "地铁站取的快递");
CompletableFuture<String> express3 = CompletableFuture.supplyAsync(() -> "公司取的快递");
// 等所有任务干完,再拿所有结果
CompletableFuture.allOf(express1, express2, express3)
.thenApply(v -> {
// 这里把3个结果拼起来
List<String> allExpress = Arrays.asList(
express1.join(), express2.join(), express3.join()
);
return "我拿到了" + allExpress.size() + "个快递:" + allExpress;
})
.thenAccept(System.out::println); // 最后输出结果
`
这样3个任务同时跑,总耗时就是“最慢那个任务的时间”,比挨个取快太多。
---
实际用的时候要注意啥?
别拿它干“太简单的活”:比如你要算1+1这种,直接用sum=2就行,没必要派个异步任务,不然反而会浪费时间(毕竟派任务、等结果也要耗资源)。
要是任务要花的时间不确定,用它就特别值:比如查数据库、调用别的接口,这些“等响应”的时间,本来是线程在空等,用CompletableFuture能让线程去干别的活,整个程序效率会高很多。
简单说,它就是帮你“不浪费等待的时间”,就像你等外卖的同时查快递,把时间用在实处。