首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CompletableFuture的使用

反正我发现两个比较严重的问题: 获取结果时,调用的future.get()方法,会阻塞当前线程,直到返回结果,大大降低性能 有一半的代码在写怎么使用线程,其实我们不应该关心怎么使用线程,更应该关注任务的处理...代码经过CompletableFuture改造后,是多么的简洁优雅。 提交任务也不用再关心线程池是怎么使用了,获取结果也不用再阻塞当前线程了。...join()方法配合Stream流是这样用的: /** * @author yideng * @apiNote CompletableFuture使用示例 */ public...看一下使用CompletableFuture是怎么重构的: /** * @author yideng * @apiNote CompletableFuture.allOf()方法使用示例...CompletableFuture常用API使用示例 用最常见的煮饭来举例: 4.1 then、handle方法使用示例 /** * @author yideng * @apiNote

46030
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何使用CompletableFuture

    CompletableFuture介绍 CompletableFuture 是Java 8中的一个很重要的类,它是一个实现了 Future 接口的异步处理类,可以帮助我们更加方便地执行异步任务和处理异步任务的结果...而 ConcurrentLinkedQueue 是Java 5中添加的一个线程安全的队列,它支持高并发下的并发读写。 CompletableFuture 底层的异步处理也是基于这两个框架的。...我们创建了一个 CompletableFuture 对象,它使用 runAsync() 方法执行了一个不需要返回值的操作。...whenComplete 这些方法的使用方式相似,都是通过链式调用的方式,如下示例: CompletableFuture future = CompletableFuture.supplyAsync...异常处理 CompletableFuture 中有很多方法可以用来处理异步任务中出现的异常,如: exceptionally handle 这些方法的使用方式相似,都是通过链式调用的方式,如下示例: CompletableFuture

    22230

    CompletableFuture使用详解

    如果指定线程池,则使用指定的线程池运行。...方法不以Async结尾,意味着Action使用相同的线程执行,而Async可能会使用其它的线程去执行(如果使用相同的线程池,也可能会被同一个线程选中执行)。...thenApply thenApply接收一个函数作为参数,使用该函数处理上一个CompletableFuture调用的结果,并返回一个具有处理结果的Future对象。...: thenApply转换的是泛型中的类型,返回的是同一个CompletableFuture; thenCompose将内部的CompletableFuture调用展开来并使用上一个CompletableFutre...,与thenAccept不同的是,thenRun会在上一阶段 CompletableFuture计算完成的时候执行一个Runnable,而Runnable并不使用该CompletableFuture计算的结果

    88720

    异步编程CompletableFuture使用

    CompletableFuture 介绍 CompletableFuture 是对 Future 的扩展, 提供了函数式编程的能力,简化了异步编程的复杂性。...函数式编程的几个接口 CompletableFuture 主要使用了函数式编程, 这里介绍几个函数式编程的接口 name type description Consumer Consumer 接收 T...Future 是 JDK5 新增的接口,用于描述一个异步的计算任务,但是使用中有很多局限: Future 对结果的获取仍是阻塞的(只能通过阻塞或轮询的方式获取结果) 无法将多个异步的计算结果合并为一个...无法等待 Future 集合的所有任务完成 任务完成后触发动作 CompletableFuture 的使用 这里只介绍 CompletableFuture 的使用,不涉及源码分析 创建一个 CompletableFuture...观察者中的dep属性:指向其对应的 CompletableFuture(如下图) 观察者中的src属性:指向其依赖的 CompletableFuture 观察者Completion中的fn属性:用来存储具体的等待被回调的函数

    47120

    异步编程CompletableFuture使用

    CompletableFuture 介绍 CompletableFuture 是对 Future 的扩展, 提供了函数式编程的能力,简化了异步编程的复杂性。...函数式编程的几个接口 CompletableFuture 主要使用了函数式编程, 这里介绍几个函数式编程的接口 name type description Consumer Consumer 接收 T...Future 是 JDK5 新增的接口,用于描述一个异步的计算任务,但是使用中有很多局限: Future 对结果的获取仍是阻塞的, 这样与异步编程的初衷相违背 无法将多个异步的计算结果合并为一个 无法等待...Future 集合的所有任务完成 任务完成后触发动作 CompletableFuture 的使用 这里只介绍 CompletableFuture 的使用,不涉及源码分析 创建一个 CompletableFuture..., 然后执行 action,不依赖两个任务的结果,无返回值 thenAcceptBothAsync: 两个 CompletableFuture 并行执行完,然后执行 action,依赖两个任务的结果,无返回值

    38910

    CompletableFuture的使用与原理解析

    2 具体方法及使用 在正常的业务代码开发中,如果我们需要使用子线程处理数据通常需要使用线程池,但手动创建线程池很麻烦,而且还需要注意销毁。...在 JDK8 中 CompletableFuture就很好的替我们解决了这个问题。下面我们来看一下如何使用这个类。...volatile Completion stack; }其中result 用来保存future的结果,stack是利用链表实现的栈,记录了这个future的后续动作,在使用CompletableFuture...有些同学看到这里可能有些疑惑,这种结构为什么不直接使用一个指针,而是使用栈。这是因为CompletableFuture 同时支持多个后续任务。...CompletableFuture 在使用起来十分便捷,但也要注意,由于服务器的cpu核数是有限的,如果使用异步的地方过多,最终也会导致阻塞,各位小伙伴在使用时也多加注意,希望各位小伙伴能点个关注,这对我们是一种很大的鼓励

    39110

    CompletableFuture常用使用方法

    项目中需要用到多渠道数据查询,使用CompletableFuture可以很好的满足需求 什么是CompletableFuture 可以实现异步任务,以及异步任务之间的协作 使用示例 String...#supplyAsync # 创建一个特殊的异步任务,当其关联的异步任务任意一个完成时就返回 CompletableFuture#anyOf # 创建一个特殊的异步任务,当其关联的异步任务都完成时就返回...,并返回新的结果 CompletableFuture#thenApply # 与其他的异步任务结合,都执行完毕后再执行新的任务 CompletableFuture#thenCombine # 继续异步处理结果...,并返回新任务对应的CompletableFuture。...与thenApplyAsync很类似,但是返回结果更加友好,类似于stream中的flatMap CompletableFuture#thenCompose # 处理最后的结果 CompletableFuture

    56120

    CompletableFuture在RocketMQ中的使用实战!

    今天想跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture, 最后呢我会结合RocketMQ源码分析一下CompletableFuture的使用。...).start();  System.out.println(futureTask.get()); 或者使用线程池的方式 ExecutorService executorService = Executors.newSingleThreadExecutor..."三友") 静态方法创建 除了使用构造方法构造,CompletableFuture还提供了静态方法来创建 public static  CompletableFuture supplyAsync...执行结果: 上一步的执行的结果为:10 thenRun示例: CompletableFuture completableFuture = CompletableFuture.supplyAsync...super T> action); CompletableFuture在RocketMQ中的使用 CompletableFuture在RocketMQ中的使用场景比较多,这里我举一个消息存储的场景。

    15410

    Java8使用CompletableFuture的部分方法

    背景 CompletableFuture的使用是为了异步编程,异步编程可以解决同步编程的性能瓶颈问题。也就是将同步操作变为了并行操作。...当我们有一大批数据需要处理的时候我们可以将这些数据分而治之,使用CompletableFuture通过线程池的多个线程进行异步执行。...CompletableFuture介绍 在1.8之前我们使用多线程操作的方法是通过CallAble来实现call方法,然后通过future获得异步的结果,其中要么是使用get()方法进行阻塞,我么轮训IsDone...于是在1.8的引入了CompletableFuture,他是针对future做了改进。通过example来看一下具体的使用 CompletableFuture的主要方法 1....) 其中没有指定线程池的是直接使用默认线程吃forkJoinPool(分而治之的代表)其中核心线程数为CPU的核心线程数。

    1.5K30

    使用CompletableFuture构建异步应用(二)

    你会了解如何使用流水线将两个接续的异步操作合并为一个异步计算操作。...将同步方法转换为异步方法 我们使用新的CompletableFuture类来将getPrice方法转换为异步的getPriceAsync方法。...使用这个API的客户端,可以通过下面的这段 代码对其进行调用。...解决这种问题的方法有两种: 客户端可以使用重载版本的get方法,它使用一个超时参数来避免发生这样的情况。 通过异步处理中发生的异常,根据不同的异常类型来进行不同的处理。...为了让客户端能了解商店无法提供请求商品价格的原因,你需要使用 CompletableFuture的completeExceptionally方法将导致CompletableFuture内发生问 题的异常抛出

    84440

    使用并行流还是CompletableFuture(四)

    我们知道,对集合进行计算,可以使用并行和异步的CompletableFuture操作,都可以加快其处理,那么到底该使用并行还是异步呢?...并行流和CompletableFuture 如上篇博客中所讲到的getPrice()方法,使用并行方式处理,代码如下: public List findPricesParallel...然而,CompletableFuture具有一定的优势,因为它允许你对执行器(Executor)进行配置,尤其是线程池的大小,让它以更适合应用需求的方式进行配置,满足程序的要求,而这是并行流API无法提供的...比如,你现在可 以按照下面的方式创建一个可查询指定商品价格的CompletableFuture对象: CompletableFuture.supplyAsync(() -> shop.getName(...反之,如果你并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用CompletableFuture灵活性更好,你可以像前文讨论的那样,依据等待/计算,或者 W/C的比率设定需要使用的线程数

    1.3K50

    使用CompletableFuture时,那些令人头疼的问题

    因为功能比较简单没什么特殊的,所以这里在使用CompletableFuture的时候,并没有自定义线程池,默认那么就是ForkJoinPool。...也就是代码示例中写的,RPC调用过程中,会使用ServiceLoader去找XX接口对应的实现类,而这个配置是在RPC框架的jar包中,这个jar包那自然肯定是在对应微服务的WEB-INFO/lib里了...问题就在于CompletableFuture.runAsync这里,这里并没有显示指定Executor,所以会使用ForkJoinPool线程池,而ForkJoinPool中的线程不会继承父线程的ClassLoader...> task1 = CompletableFuture.runAsync(() -> { },new MyExecutorService()); 那就是不使用CompletableFuture...的默认线程池ForkJoinPool,转而使用我们的自定义线程池

    3.8K00
    领券