iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java8 使用工厂方法supplyAsync创建CompletableFuture实例
  • 749
分享到

Java8 使用工厂方法supplyAsync创建CompletableFuture实例

2024-04-02 19:04:59 749人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录使用工厂方法 supplyAsync创建 CompletableFuture对比对CompletableFuture async的理解目前为止我们已经了解了如何通过编程创建 Co

目前为止我们已经了解了如何通过编程创建 CompletableFuture 对象以及如何获取返回值,虽然看起来这些操作已经比较方便,但还有进一步提升的空间, CompletableFuture 类自身提供了大量精巧的工厂方法,使用这些方法能更容易地完成整个流程,还不用担心实现的细节。

在这里插入图片描述

可以看到我们使用new Thread的方式,显然是不恰当的。

使用工厂方法 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似是与线程无关的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • Java8 使用工厂方法supplyAsync创建CompletableFuture实例
    目录使用工厂方法 supplyAsync创建 CompletableFuture对比对CompletableFuture async的理解目前为止我们已经了解了如何通过编程创建 Co...
    99+
    2024-04-02
  • 分析Java8使用工厂方法supplyAsync创建CompletableFuture
    这篇文章主要介绍“分析Java8使用工厂方法supplyAsync创建CompletableFuture”,在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建CompletableFuture问题上存在疑惑,小编...
    99+
    2023-06-25
  • Java8 使用CompletableFuture 构建异步应用方式
    目录概述同步API VS 异步API同步API异步API同步的困扰实现异步API将同步方法改为异步方法处理异常错误概述 为了展示 CompletableFuture 的强大特性, 创...
    99+
    2024-04-02
  • Java8如何使用CompletableFuture构建异步应用方式
    小编给大家分享一下Java8如何使用CompletableFuture构建异步应用方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述为了展示 Completa...
    99+
    2023-06-25
  • java工厂模式创建对象的方法是什么
    Java工厂模式创建对象的方法是通过工厂类来创建对象。工厂类根据客户端的需求,创建一种或多种不同类型的对象。这种方法将对象的实例化过...
    99+
    2023-10-20
    java
  • C++工厂方法之对象创建型模式详解
    目录1.代码示例2.工厂方法模式的定义(实现意图)总结1.代码示例 工厂方法模式,简称工厂模式或者多态工厂模式。与简单工厂模式相比,引入了更多的新类,灵活性更强,实现也更加复杂。符合...
    99+
    2024-04-02
  • Java通过工厂、Map容器创建对象的方法
    一、通过工厂+反射+配置文件创建对象 通过工厂+反射+配置文件获取对象 public class AbsFactory { //声明一个变量(多例模式,每次通过工厂都会创...
    99+
    2024-04-02
  • java编程创建型设计模式工厂方法模式示例详解
    目录1.什么是工厂方法模式?2.案例实现3.JDK中的工厂方法模式1.什么是工厂方法模式? 工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐...
    99+
    2024-04-02
  • Go泛型应用工厂方法及泛型使用实例分析
    本篇内容介绍了“Go泛型应用工厂方法及泛型使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口实现泛化编程平时我们编写结构体和方法...
    99+
    2023-07-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
  • QtDesignStudio创建工程的实现方法
    目录Creating Projects使用项目向导向项目中添加文件Creating Projects Qt Design Studio的主要优势之一是,它允许设计人员和开发人员使用通...
    99+
    2024-04-02
  • javaExecutors工具类的相关方法使用创建
    目录通过Executors类创建线程池newCachedThreadPool方法newFixThreadPool方法newScheduledThreadPool方法newSingle...
    99+
    2022-11-16
    java Executors工具类 java Executors
  • Java创建型设计模式之工厂方法模式深入详解
    目录简单工厂模式定义产品对象创建工厂类工厂使用反射工厂方法模式概述应用场景优缺点主要角色工厂方法模式的基本使用创建抽象产品创建具体产品创建抽象工厂创建具体工厂客户端执行简单工厂模式 ...
    99+
    2024-04-02
  • MySql创建分区的方法实例
    目录一、Mysql分区类型二、RANGE分区二、Hash分区三、Key分区四、List分区附:查询分区,各区表数据量总结友情链接一、Mysql分区类型 1、RANGE 分区:基于属于...
    99+
    2024-04-02
  • 使用web工厂方法的效果有哪些
    本篇内容主要讲解“使用web工厂方法的效果有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用web工厂方法的效果有哪些”吧!效果工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理...
    99+
    2023-06-19
  • Go泛型应用工厂方法及泛型使用
    目录前言接口实现泛化编程工厂+泛型来实现更通用的泛化编程泛型使用的最佳时机关于功能设计的简单建议最后前言 由于网上关于泛型使用的文章太多了,这里就不聊怎么使用泛型了,今天我们结合工厂...
    99+
    2024-04-02
  • python创建堆的方法实例讲解
    1、说明 创建堆有两种基本方法:heappush() 和 heapify()。 当使用heappush()时,当新元素添加时,堆得顺序被保持了。 如果数据已经在内存中,则使用 hea...
    99+
    2024-04-02
  • 怎么用Java代码实现工厂方法模式
    今天小编给大家分享一下怎么用Java代码实现工厂方法模式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 工厂方法模式介绍...
    99+
    2023-06-29
  • mysql创建索引的3种方法实例
    目录1、使用CREATE INDEX创建,语法如下:2、使用ALTER语句创建,语法如下:3、建表的时候创建索引补充:mysql 创建索引原则总结1、使用CREATE INDEX创建,语法如下: CREATEINDEXi...
    99+
    2023-02-15
    mysql创建索引语句 mysql索引创建 mysql添加索引语句
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作