千家信息网

分析Java8使用工厂方法supplyAsync创建CompletableFuture

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"分析Java8使用工厂方法supplyAsync创建CompletableFuture",在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建Complet
千家信息网最后更新 2026年11月02日分析Java8使用工厂方法supplyAsync创建CompletableFuture

这篇文章主要介绍"分析Java8使用工厂方法supplyAsync创建CompletableFuture",在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建CompletableFuture问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"分析Java8使用工厂方法supplyAsync创建CompletableFuture"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

使用工厂方法 supplyAsync创建 CompletableFuture

采用 supplyAsync 方法后,可以用一行代码重写getPriceAsync 方法。

【使用工厂方法 supplyAsync 创建 CompletableFuture 对象】

public Future getPriceAsync(String product) {        return CompletableFuture.supplyAsync(() -> calculatePrice(product));}

supplyAsync 方法接受一个生产者( Supplier )作为参数,返回一个 CompletableFuture对象,该对象完成异步执行后会读取调用生产者方法的返回值。

生产者方法会交由 ForkJoinPool池中的某个执行线程( Executor )运行,但是你也可以使用 supplyAsync 方法的重载版本,传递第二个参数指定不同的执行线程执行生产者方法。

一般而言,向 CompletableFuture 的工厂方法传递可选参数,指定生产者方法的执行线程是可行的,后面我们会会介绍如何使用适合你应用特性的执行线程改善程序的性能。

对比

刚刚的代码

public Future getPriceAsync(String product) {        return CompletableFuture.supplyAsync(() -> calculatePrice(product));}

getPriceAsync 方法返回的 CompletableFuture 对象和 下面的代码

public Future getPriceAsync(String product) {        CompletableFuture futurePrice = new CompletableFuture<>();        new Thread( () -> {                try {                        double price = calculatePrice(product);                        futurePrice.complete(price);        } catch (Exception ex) {                        futurePrice.completeExceptionally(ex);        }        }).start();        return futurePrice;}

手工创建和完成的 CompletableFuture 对象是完全等价的,这意味着它提供了同样的错误管理机制,而前者你花费了大量的精力才得以构建。

对CompletableFuture async的理解

验证代码如下

ExecutorService executorService = Executors.newFixedThreadPool(3);        //executorService.submit(new RuleTestRunnable(1));        List taskList = new ArrayList<>();        for (int i = 0; i < 30; i++) {            taskList.add(i);        }        CompletableFuture a1 = CompletableFuture.supplyAsync(() -> {            logger.info("线程1{}{}","开始");             try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            logger.info("线程1{}{}","结束");            return "1";        },executorService);       CompletableFuture a2 = CompletableFuture.supplyAsync(() -> {             logger.info("线程2{}{}","开始");            try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            logger.info("线程2{}{}","结束");            return "1";        },executorService);        CompletableFuture a= a1.thenCombineAsync(a2,(s1,s2) -> {            logger.info("组合线程{}{}");            return  s1+s2;        },executorService);        Object result = a.get();

当executorService线程池大小为2时候,执行结果如下:

[pool-4-thread-1] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 组合线程{}{}

a1.thenCombineAsync方法始终被线程1或2执行

当executorService线程池大小为3时候,执行结果如下:

[pool-4-thread-3] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 组合线程{}{}

a1.thenCombineAsync方法始终被线程3执行

改为a1.thenCombine(),执行结果:

a1.thenCombineAsync方法始终被线程1或2执行

由此可见,async方法始终尝试取新线程执行方法,不带async方法则会从当前线程里取线程执行.CompletableFuture似是与线程无关的。

到此,关于"分析Java8使用工厂方法supplyAsync创建CompletableFuture"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 线程 工厂 对象 生产者 生产 分析 代码 学习 参数 结果 组合 大小 时候 更多 帮助 不同 可行 实用 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 互联网科技公司华为 互联网和科技创新 科技企业和互联网企业 互联网与新科技 互联网科技上市公司 天下捷融互联网科技 农村开互联网科技讲堂 北京华百购互联网科技有限公司 互联网校园科技培训 互联网行业科技股 深圳艾果互联网通讯科技 恒生互联网科技业指数调整周期 工业互联网山东科技大学 山东星卡互联网科技有限公司官网 黑云互联网科技有限公司 宁波跨境商互联网科技有限公司 广州梦谷互联网科技有限公司领导 互联网科技创新方面的资料 互联网企业和网络科技有限公司 互联网新科技 广东万易互联网科技有限公司惠州分公司 苏州找大状互联网科技有限公司 朗新科技与工业互联网 齐家互联网科技 互联网科技公司介绍 彤创互联网科技有限公司 互联网科技实习生岗位 互联网科技年终奖 兰石爱特工业互联网科技分公司
0