Java CompletableFuture 怎么用

生活里你肯定遇过这种场景:早上同时用手机点外卖、同步查快递、还得给同事发工作消息,要是一件一件做,等外卖的功夫都能把活儿干完了。那有没有办法“同时处理好几件事,还能把结果凑到一块儿用”?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能让线程去干别的活,整个程序效率会高很多。

简单说,它就是帮你“不浪费等待的时间”,就像你等外卖的同时查快递,把时间用在实处。

上一篇 Swift语言核心特性与移动端开发高效应用科普