iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >分析Java8使用工厂方法supplyAsync创建CompletableFuture
  • 271
分享到

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

2023-06-25 13:06:17 271人浏览 安东尼
摘要

这篇文章主要介绍“分析Java8使用工厂方法supplyAsync创建CompletableFuture”,在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建CompletableFuture问题上存在疑惑,小编

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

使用工厂方法 supplyAsync创建 CompletableFuture

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

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

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

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

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

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

对比

刚刚的代码

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

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

public Future<Double> getPriceAsync(String product) {CompletableFuture<Double> 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<Integer> taskList = new ArrayList<>();        for (int i = 0; i < 30; i++) {            taskList.add(i);        }        CompletableFuture<String> a1 = CompletableFuture.supplyAsync(() -> {            logger.info("线程1{}{}","开始");             try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            logger.info("线程1{}{}","结束");            return "1";        },executorService);       CompletableFuture<String> a2 = CompletableFuture.supplyAsync(() -> {             logger.info("线程2{}{}","开始");            try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            logger.info("线程2{}{}","结束");            return "1";        },executorService);        CompletableFuture<Object> 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”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 分析Java8使用工厂方法supplyAsync创建CompletableFuture

本文链接: https://www.lsjlt.com/news/304860.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分析Java8使用工厂方法supplyAsync创建CompletableFuture
    这篇文章主要介绍“分析Java8使用工厂方法supplyAsync创建CompletableFuture”,在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建CompletableFuture问题上存在疑惑,小编...
    99+
    2023-06-25
  • Java8 使用工厂方法supplyAsync创建CompletableFuture实例
    目录使用工厂方法 supplyAsync创建 CompletableFuture对比对CompletableFuture async的理解目前为止我们已经了解了如何通过编程创建 Co...
    99+
    2024-04-02
  • Java8 使用CompletableFuture 构建异步应用方式
    目录概述同步API VS 异步API同步API异步API同步的困扰实现异步API将同步方法改为异步方法处理异常错误概述 为了展示 CompletableFuture 的强大特性, 创...
    99+
    2024-04-02
  • Java8如何使用CompletableFuture构建异步应用方式
    小编给大家分享一下Java8如何使用CompletableFuture构建异步应用方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述为了展示 Completa...
    99+
    2023-06-25
  • Go泛型应用工厂方法及泛型使用实例分析
    本篇内容介绍了“Go泛型应用工厂方法及泛型使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口实现泛化编程平时我们编写结构体和方法...
    99+
    2023-07-02
  • java工厂模式创建对象的方法是什么
    Java工厂模式创建对象的方法是通过工厂类来创建对象。工厂类根据客户端的需求,创建一种或多种不同类型的对象。这种方法将对象的实例化过...
    99+
    2023-10-20
    java
  • C++工厂方法之对象创建型模式详解
    目录1.代码示例2.工厂方法模式的定义(实现意图)总结1.代码示例 工厂方法模式,简称工厂模式或者多态工厂模式。与简单工厂模式相比,引入了更多的新类,灵活性更强,实现也更加复杂。符合...
    99+
    2024-04-02
  • Java通过工厂、Map容器创建对象的方法
    一、通过工厂+反射+配置文件创建对象 通过工厂+反射+配置文件获取对象 public class AbsFactory { //声明一个变量(多例模式,每次通过工厂都会创...
    99+
    2024-04-02
  • Spring框架开发IOC两种创建工厂方法详解
    1.IOC有两种创建工厂的方法 IoC 通过工厂模式创建 bean 的方式有两种: 静态工厂方法 实例工厂方法 2.两种方法的不同 2.1静态方法创建 就是直接可以通过静态方法来实例...
    99+
    2024-04-02
  • .Net创建型设计模式之工厂方法模式(Factory Method)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、工厂方法模式的代码实现六、Factory Method模式的几个要点1、工...
    99+
    2024-04-02
  • javaExecutors工具类的相关方法使用创建
    目录通过Executors类创建线程池newCachedThreadPool方法newFixThreadPool方法newScheduledThreadPool方法newSingle...
    99+
    2022-11-16
    java Executors工具类 java Executors
  • Java创建型设计模式之工厂方法模式深入详解
    目录简单工厂模式定义产品对象创建工厂类工厂使用反射工厂方法模式概述应用场景优缺点主要角色工厂方法模式的基本使用创建抽象产品创建具体产品创建抽象工厂创建具体工厂客户端执行简单工厂模式 ...
    99+
    2024-04-02
  • 使用web工厂方法的效果有哪些
    本篇内容主要讲解“使用web工厂方法的效果有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用web工厂方法的效果有哪些”吧!效果工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理...
    99+
    2023-06-19
  • java编程创建型设计模式工厂方法模式示例详解
    目录1.什么是工厂方法模式?2.案例实现3.JDK中的工厂方法模式1.什么是工厂方法模式? 工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐...
    99+
    2024-04-02
  • Go泛型应用工厂方法及泛型使用
    目录前言接口实现泛化编程工厂+泛型来实现更通用的泛化编程泛型使用的最佳时机关于功能设计的简单建议最后前言 由于网上关于泛型使用的文章太多了,这里就不聊怎么使用泛型了,今天我们结合工厂...
    99+
    2024-04-02
  • win7创建逻辑分区的方法(diskpart命令使用方法)
    win7创建逻辑分区 许多用户在安装Win7时都遇,安装程序创建的都是主分区,并没有创建逻辑分区的任何选项,这样的情况导致创建4个主分区后剩余的空间无法继续分配的情况,这使得许多用户情何以堪。很多用户都向小编反映该问题,...
    99+
    2023-06-04
    win7分区 diskpart 方法 分区 逻辑 命令
  • 在什么情况下可以使用web工厂方法
    这篇文章主要介绍了在什么情况下可以使用web工厂方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在什么情况下可以使用web工厂方法文章都会有所收获,下面我们一起来看看吧。适用性在下列情况下可以使用Factor...
    99+
    2023-06-19
  • 能源管控系统开发方案,智慧工厂能耗分析平台搭建
    能源管控系统开发方案,智慧工厂能耗分析平台搭建能源管理系统为企业提供了科学精准的数据,帮助对各种能源介质的能耗分析,管理者可以更科学的对各种能源进行优化决策调度,及时了解和掌握各种能源的生产、使用和运行工况,做到科学决策,正确指挥。源中瑞的...
    99+
    2023-06-05
  • Pythondefaultdict方法使用分析
    目录defaultdict底层代码Python的字典是否有默认值defaultdict底层代码 在字典中查找某个值时,若key不存在时则会返回一个KeyError错误而不是一个默认...
    99+
    2024-04-02
  • Android使用createNewFile()方法创建文件
    在Android中,使用`createNewFile()`方法可以创建一个新文件。以下是一种常见的使用方法:```javaFile ...
    99+
    2023-09-16
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作