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

CompletableFuture 使用介绍

本文安利一个 Java8 的工具 CompletableFuture,这是 Java8 带来的一个非常好用的用于异步编程的类。 还没使用过的小伙伴,赶紧用起来吧。...上面的代码确实没什么用,下面介绍几个 static 方法,它们使用任务来实例化一个 CompletableFuture 实例。...所以最终的输出结果是: errorResultA resultB resultC resultD 再看下面的代码,我们来看下另一种处理方式,使用 handle(BiFunction fn) 来处理异常:...anyOf 也非常容易理解,就是只要有任意一个 CompletableFuture 实例执行完成就可以了,看下面的例子: CompletableFuture cfA = CompletableFuture.supplyAsync...(cfA, cfB, cfC); Object result = future.join(); 最后一行的 join() 方法会返回最先完成的任务的结果,所以它的泛型用的是 Object,因为每个任务可能返回的类型不同

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

CompletableFuture使用

结果1 结果2 结果3 一般大家都会这样使用线程池,但是有没有思考过这样使用有没有什么问题?...: 结果1 结果2 结果3 代码中使用CompletableFuture的两个方法, supplyAsync()方法作用是提交异步任务,有两个传参,任务和自定义线程池。...遍历list集合,提交CompletableFuture任务,把结果转换成数组 再把数组放到CompletableFuture的allOf()方法里面 最后调用join()方法阻塞等待所有任务执行完成...3.3 一个线程执行完成,交给另一个线程接着执行 有这么一个需求: 一个线程处理完成,把处理的结果交给另一个线程继续处理,怎么实现?...获取结果 join 阻塞等待,不会抛异常 get 阻塞等待,会抛异常 complete(T value) 不阻塞,如果任务已完成,返回处理结果。如果没完成,则返回传参value。

43330

CompletableFuture使用详解

():两个任务都执行完成后,执行下一步操作(Runnable类型任务) or聚合关系 applyToEither():两个任务哪个执行的快,就使用哪一个结果,有返回值 acceptEither():两个任务哪个执行的快...完成时,返回一个新的 CompletableFuture anyOf():当任何一个给定的CompletablFuture完成时,返回一个新的CompletableFuture 结果处理 whenComplete...:当任务完成时,将使用结果(或 null)和此阶段的异常(或 null如果没有)执行给定操作 exceptionally:返回一个新的CompletableFuture,当前面的CompletableFuture...thenApply thenApply接收一个函数作为参数,使用该函数处理上一个CompletableFuture调用的结果,并返回一个具有处理结果的Future对象。...计算完成的时候执行一个Runnable,而Runnable并不使用CompletableFuture计算的结果

76620

CompletableFuture 使用指南

异步回调:可以在任务完成后执行回调函数,而不阻塞主线程。 异常处理:在异步操作中更方便地处理异常情况。 代码示例 以下代码演示了在 Java 中使用CompletableFuture处理异步计算。...future.join();这一行是一个阻塞操作,它会等待异步任务完成。如果异步任务已经完成,则立即返回;否则,它会一直等待直到异步任务完成。...这个示例展示了CompletableFuture如何简化异步编程。你可以使用lambda表达式来定义异步任务,并使用thenAccept等方法来注册对任务结果的处理逻辑。...这个示例展示了CompletableFuture如何通过链式调用和结果转换来组合多个异步任务。每个thenApply方法都会在上一个任务完成后异步执行,并将结果传递给下一个任务。...在这里,使用System.out::println方法引用作为Consumer的实现,它将打印上一个任务的结果(即备用结果"Timeout occurred"或成功结果"Result after delay

10810

异步编程CompletableFuture使用

函数式编程的几个接口 CompletableFuture 主要使用了函数式编程, 这里介绍几个函数式编程的接口 name type description Consumer Consumer 接收 T...: Future 对结果的获取仍是阻塞的(只能通过阻塞或轮询的方式获取结果) 无法将多个异步的计算结果合并为一个 无法等待 Future 集合的所有任务完成 任务完成后触发动作 CompletableFuture...的使用 这里只介绍 CompletableFuture使用,不涉及源码分析 创建一个 CompletableFuture 任务 runAsync: 不支持返回值 supplyAsync: 支持返回值...action,不关心上一个任务的结果,无返回值 thenAcceptAsync 任务完成运行 action, 依赖上一个任务结果, 无返回值 thenApplyAsync 任务完成运行 action,...> anyFuture = CompletableFuture.anyOf(cfA, cfB, cfC); // join 会返回最先完成的任务, 也是返回最先完成任务的结果 Object result

42620

异步编程CompletableFuture使用

函数式编程的几个接口 CompletableFuture 主要使用了函数式编程, 这里介绍几个函数式编程的接口 name type description Consumer Consumer 接收 T...: Future 对结果的获取仍是阻塞的, 这样与异步编程的初衷相违背 无法将多个异步的计算结果合并为一个 无法等待 Future 集合的所有任务完成 任务完成后触发动作 CompletableFuture...的使用 这里只介绍 CompletableFuture使用,不涉及源码分析 创建一个 CompletableFuture 任务 runAsync: 不支持返回值 supplyAsync: 支持返回值...action,不关心上一个任务的结果,无返回值 thenAcceptAsync 任务完成运行 action, 依赖上一个任务结果, 无返回值 thenApplyAsync 任务完成运行 action,...CompletableFuture.anyOf(cfA, cfB, cfC); // join 会返回最先完成的任务, 也是返回最先完成任务的结果 Object result = anyFuture.join

34410

CompletableFuture常用使用方法

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

53020

使用并行流还是CompletableFuture(四)

我们知道,对集合进行计算,可以使用并行和异步的CompletableFuture操作,都可以加快其处理,那么到底该使用并行还是异步呢?...并行流和CompletableFuture 如上篇博客中所讲到的getPrice()方法,使用并行方式处理,代码如下: public List findPricesParallel...比如,你现在可 以按照下面的方式创建一个可查询指定商品价格的CompletableFuture对象: CompletableFuture.supplyAsync(() -> shop.getName(...反之,如果你并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用CompletableFuture灵活性更好,你可以像前文讨论的那样,依据等待/计算,或者 W/C的比率设定需要使用的线程数...这种情况不使用并行流的另一个原因是,处理流的 流水线中如果发生I/O等待,流的延迟特性会让我们很难判断到底什么时候触发了等待。

1.3K50

CompletableFuture的特点以及常规使用

CompletableFuture的原理主要是基于Java的Future模式和函数式编程思想。它封装了一个异步操作,并在操作完成后返回一个Future对象,可以通过该对象获取异步操作的结果。...支持合并操作:可以使用thenCombine()、thenCompose()和allOf()等方法合并多个异步操作的结果。...在实现上,CompletableFuture使用了Java的线程池来实现异步执行,它可以在任务完成时通知等待该结果的线程。...二 使用使用 CompletableFuture 时,我们通常需要执行以下步骤: 创建一个 CompletableFuture 对象。...下面是一些常见的 CompletableFuture 使用场景及示例代码: 异步执行任务并获取结果CompletableFuture future = CompletableFuture.supplyAsync

40710

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

为等待同步事件完成而等待1秒钟,这是无法接受的,尤其是考虑到最佳价格查询器对 网络中的所有商店都要重复这种操作。在本文的下个小节中,你会了解如何以异步方式使用同 步API解决这个问题。...将同步方法转换为异步方法 我们使用新的CompletableFuture类来将getPrice方法转换为异步的getPriceAsync方法。...对象,它会包含计算的结果 CompletableFuture futurePrice = new CompletableFuture(); //在另一个线程中以异步方式执行计算...对象实例,它在计算完 成时会包含计算的结果。...为了让客户端能了解商店无法提供请求商品价格的原因,你需要使用 CompletableFuture的completeExceptionally方法将导致CompletableFuture内发生问 题的异常抛出

82440

聊聊Java中CompletableFuture使用

多任务并行协作 假如我们要做咖啡,有3个子任务可以并行执行:洗杯子、磨咖啡、烧水,这3步完成后,我们开始泡咖啡。这种需求我们一般怎么实现呢? 下面我们看一下,使用Future是怎么完成这个功能的。...,阻塞了主线程,等3个步骤都执行完成,主线程才能执行。...输出如下: 洗杯子 烧水 磨咖啡 我是主线程 泡咖啡 如果我们使用CompletableFuture来写,要怎么实现呢?...如果前面3个任务只有一个完成最后一个任务就可以执行,那就用anyOf方法,把上面代码中allOf改成anyOf,其他代码不变,执行结果如下: 我是主线程 洗杯子 泡咖啡 烧水 磨咖啡 注意: 1.anyOf...接口中定义的方法选择使用

82210

CompletableFuture使用与原理解析

它能够以一种非常灵活的方式处理异步操作的结果,包括成功的结果、异常和取消等情况。接下来,我们就详细了解一下这个类。...super Throwable> action);这几个方法都是用来在CompletableFuture完成后进行下一步处理,这里使用thenApply举一个例子CompletableFuture<Score...volatile Completion stack; }其中result 用来保存future的结果,stack是利用链表实现的栈,记录了这个future的后续动作,在使用CompletableFuture...有些同学看到这里可能有些疑惑,这种结构为什么不直接使用一个指针,而是使用栈。这是因为CompletableFuture 同时支持多个后续任务。...CompletableFuture使用起来十分便捷,但也要注意,由于服务器的cpu核数是有限的,如果使用异步的地方过多,最终也会导致阻塞,各位小伙伴在使用时也多加注意,希望各位小伙伴能点个关注,这对我们是一种很大的鼓励

23610

使用CompletableFuture优化Java中的阻塞任务

在Java中,CompletableFuture 是一个用于异步编程的类,它代表了某个计算的结果,这个计算可能还没有完成。...使用 supplyAsync 处理有返回值的任务supplyAsync 方法接受一个 Supplier 类型的参数,这个 Supplier 应该返回一个结果。...supplyAsync 方法会异步地执行这个 Supplier,并返回一个 CompletableFuture,这个 CompletableFuture 会在计算完成时包含 Supplier 的结果。...但是,如果你想要等待任务完成,可以调用future.join() future.join(); // 等待任务完成,但不会返回结果 }}等待所有请求完成如果你有一组 CompletableFuture...,并且你想要等待它们全部完成,你可以使用 CompletableFuture.allOf 方法。

5210

Java8 - 使用CompletableFuture 构建异步应用

异步API 与同步API相反,异步API会直接返回,或者至少在被调用方计算完成之前,将它剩余的计算任务交给另一个线程去做,该线程和调用方是异步的。 这就是非阻塞调用。...执行剩余的计算任务的线程将他的计算结果返回给调用方。 返回的方式要么通过回调函数,要么由调用方再此执行一个“等待,指导计算完成”的方法调用。...在这段代码中,创建了一个代表异步计算的 CompletableFuture 对象实例,它在计算完成时会包含计算的结果。...当请求的产品价格最终计算得出时,你可以使用它的 complete 方法,结束completableFuture 对象的运行,并设置变量的值。...为了让客户端能了解商店无法提供请求商品价格的原因,你需要使用 CompletableFuture 的 completeExceptionally 方法将导致 CompletableFuture 内发生问题的异常抛出

93720

CompletableFuture在RocketMQ中的使用实战!

今天想跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture, 最后呢我会结合RocketMQ源码分析一下CompletableFuture使用。..."三友") 静态方法创建 除了使用构造方法构造,CompletableFuture还提供了静态方法来创建 public static  CompletableFuture supplyAsync...(() -> 10)       .thenRun(() -> System.out.println("上一步执行完成")); 执行结果: 上一步执行完成 thenAccept示例: CompletableFuture...("上一步执行完成结果为:" + v)); 执行结果: 上一步执行完成结果为:10 thenApply有异常示例: CompletableFuture completableFuture...super T> action); CompletableFuture在RocketMQ中的使用 CompletableFuture在RocketMQ中的使用场景比较多,这里我举一个消息存储的场景。

11110

Java8使用CompletableFuture的部分方法

背景 CompletableFuture使用是为了异步编程,异步编程可以解决同步编程的性能瓶颈问题。也就是将同步操作变为了并行操作。...当我们有一大批数据需要处理的时候我们可以将这些数据分而治之,使用CompletableFuture通过线程池的多个线程进行异步执行。...CompletableFuture介绍 在1.8之前我们使用多线程操作的方法是通过CallAble来实现call方法,然后通过future获得异步的结果,其中要么是使用get()方法进行阻塞,我么轮训IsDone...计算结果完成时回掉方法 当我们异步调用完成调用后,计算结果完成或者异常的时候我们应该如何接受结果呢?...总结 CompletableFuture的由来 还有CompleteTableTuture的异步提交,接受任务结果,接受任务结果且处理,任务完成执行等。 部分方法

1.5K30
领券