本文安利一个 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,因为每个任务可能返回的类型不同
当CompletableFuture的计算结果完成,或者抛出异常的时候,可以执行特定的Action。...,可以使用 thenApply 方法来把这两个线程串行化。...4、 handle 方法 handle 是执行任务完成时对结果的处理。 handle 方法和 thenApply 方法处理方式基本一样。...6、thenRun 方法 跟 thenAccept 方法不一样的是,不关心任务的处理结果。只要上面的任务执行完成,就开始执行 thenAccept 。...不同的是上个任务处理完成后,并不会把计算的结果传给 thenRun 方法。只是处理玩任务后,执行 thenAccept 的后续操作。
我们创建了一个 CompletableFuture 对象,它使用 runAsync() 方法执行了一个不需要返回值的操作。...,将其结果作为参数传递给 thenApply 中的函数,返回另一个 CompletableFuture 。...thenAccept 方法会在 future 任务完成后,将其结果作为参数传递给 thenAccept 中的函数,不返回任何结果。...thenCompose 方法会在 future 任务完成后,将其结果作为参数传递给 thenCompose 中的 CompletableFuture ,返回另一个 CompletableFuture 。...thenCombine 方法会在 future 和 future5 任务都完成后,将两个任务的结果作为参数传递给 thenCombine 中的函数,返回另一个 CompletableFuture 。
: 结果1 结果2 结果3 一般大家都会这样使用线程池,但是有没有思考过这样使用有没有什么问题?...: 结果1 结果2 结果3 代码中使用了CompletableFuture的两个方法, supplyAsync()方法作用是提交异步任务,有两个传参,任务和自定义线程池。...遍历list集合,提交CompletableFuture任务,把结果转换成数组 再把数组放到CompletableFuture的allOf()方法里面 最后调用join()方法阻塞等待所有任务执行完成...3.3 一个线程执行完成,交给另一个线程接着执行 有这么一个需求: 一个线程处理完成,把处理的结果交给另一个线程继续处理,怎么实现?...获取结果 join 阻塞等待,不会抛异常 get 阻塞等待,会抛异常 complete(T value) 不阻塞,如果任务已完成,返回处理结果。如果没完成,则返回传参value。
():两个任务都执行完成后,执行下一步操作(Runnable类型任务) or聚合关系 applyToEither():两个任务哪个执行的快,就使用哪一个结果,有返回值 acceptEither():两个任务哪个执行的快...完成时,返回一个新的 CompletableFuture anyOf():当任何一个给定的CompletablFuture完成时,返回一个新的CompletableFuture 结果处理 whenComplete...:当任务完成时,将使用结果(或 null)和此阶段的异常(或 null如果没有)执行给定操作 exceptionally:返回一个新的CompletableFuture,当前面的CompletableFuture...thenApply thenApply接收一个函数作为参数,使用该函数处理上一个CompletableFuture调用的结果,并返回一个具有处理结果的Future对象。...计算完成的时候执行一个Runnable,而Runnable并不使用该CompletableFuture计算的结果。
异步回调:可以在任务完成后执行回调函数,而不阻塞主线程。 异常处理:在异步操作中更方便地处理异常情况。 代码示例 以下代码演示了在 Java 中使用来CompletableFuture处理异步计算。...future.join();这一行是一个阻塞操作,它会等待异步任务完成。如果异步任务已经完成,则立即返回;否则,它会一直等待直到异步任务完成。...这个示例展示了CompletableFuture如何简化异步编程。你可以使用lambda表达式来定义异步任务,并使用thenAccept等方法来注册对任务结果的处理逻辑。...这个示例展示了CompletableFuture如何通过链式调用和结果转换来组合多个异步任务。每个thenApply方法都会在上一个任务完成后异步执行,并将结果传递给下一个任务。...在这里,使用System.out::println方法引用作为Consumer的实现,它将打印上一个任务的结果(即备用结果"Timeout occurred"或成功结果"Result after delay
函数式编程的几个接口 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
函数式编程的几个接口 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
super U> action, Executor executor); 当两个CompletionStage都执行完成后,把结果一块处理。thenAcceptBoth 系列没有返回值。...,我就用那个CompletionStage的结果进行下一步的转化操作。...,将其结果作为参数传递给第二个操作。...future.get()); 输出 supplyAsyncForkJoinPool.commonPool-worker-1 future2-step1 感觉和前面的没啥区别呀 10.whenComplete 计算结果完成时的处理...java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) 可以看到其实就算accept,整个程序依然会崩溃 11.handle 功能和上面一点一样,计算结果完成时的处理
项目中需要用到多渠道数据查询,使用CompletableFuture可以很好的满足需求 什么是CompletableFuture 可以实现异步任务,以及异步任务之间的协作 使用示例 String...#supplyAsync # 创建一个特殊的异步任务,当其关联的异步任务任意一个完成时就返回 CompletableFuture#anyOf # 创建一个特殊的异步任务,当其关联的异步任务都完成时就返回...CompletableFuture#allOf # 当发生异常时的处理逻辑:注意,出现异常后,执行逻辑还会继续,并不会跳出来 CompletableFuture#exceptionally # 继续处理结果...,并返回新的结果 CompletableFuture#thenApply # 与其他的异步任务结合,都执行完毕后再执行新的任务 CompletableFuture#thenCombine # 继续异步处理结果...与thenApplyAsync很类似,但是返回结果更加友好,类似于stream中的flatMap CompletableFuture#thenCompose # 处理最后的结果 CompletableFuture
为等待同步事件完成而等待1秒钟,这是无法接受的,尤其是考虑到最佳价格查询器对 网络中的所有商店都要重复这种操作。在本文的下个小节中,你会了解如何以异步方式使用同 步API解决这个问题。...将同步方法转换为异步方法 我们使用新的CompletableFuture类来将getPrice方法转换为异步的getPriceAsync方法。...对象,它会包含计算的结果 CompletableFuture futurePrice = new CompletableFuture(); //在另一个线程中以异步方式执行计算...对象实例,它在计算完 成时会包含计算的结果。...为了让客户端能了解商店无法提供请求商品价格的原因,你需要使用 CompletableFuture的completeExceptionally方法将导致CompletableFuture内发生问 题的异常抛出
CompletableFuture的原理主要是基于Java的Future模式和函数式编程思想。它封装了一个异步操作,并在操作完成后返回一个Future对象,可以通过该对象获取异步操作的结果。...支持合并操作:可以使用thenCombine()、thenCompose()和allOf()等方法合并多个异步操作的结果。...在实现上,CompletableFuture使用了Java的线程池来实现异步执行,它可以在任务完成时通知等待该结果的线程。...二 使用 当使用 CompletableFuture 时,我们通常需要执行以下步骤: 创建一个 CompletableFuture 对象。...下面是一些常见的 CompletableFuture 使用场景及示例代码: 异步执行任务并获取结果: CompletableFuture future = CompletableFuture.supplyAsync
多任务并行协作 假如我们要做咖啡,有3个子任务可以并行执行:洗杯子、磨咖啡、烧水,这3步完成后,我们开始泡咖啡。这种需求我们一般怎么实现呢? 下面我们看一下,使用Future是怎么完成这个功能的。...,阻塞了主线程,等3个步骤都执行完成,主线程才能执行。...输出如下: 洗杯子 烧水 磨咖啡 我是主线程 泡咖啡 如果我们使用CompletableFuture来写,要怎么实现呢?...如果前面3个任务只有一个完成最后一个任务就可以执行,那就用anyOf方法,把上面代码中allOf改成anyOf,其他代码不变,执行结果如下: 我是主线程 洗杯子 泡咖啡 烧水 磨咖啡 注意: 1.anyOf...接口中定义的方法选择使用。
我们知道,对集合进行计算,可以使用并行和异步的CompletableFuture操作,都可以加快其处理,那么到底该使用并行还是异步呢?...并行流和CompletableFuture 如上篇博客中所讲到的getPrice()方法,使用并行方式处理,代码如下: public List findPricesParallel...比如,你现在可 以按照下面的方式创建一个可查询指定商品价格的CompletableFuture对象: CompletableFuture.supplyAsync(() -> shop.getName(...反之,如果你并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用CompletableFuture灵活性更好,你可以像前文讨论的那样,依据等待/计算,或者 W/C的比率设定需要使用的线程数...这种情况不使用并行流的另一个原因是,处理流的 流水线中如果发生I/O等待,流的延迟特性会让我们很难判断到底什么时候触发了等待。
它能够以一种非常灵活的方式处理异步操作的结果,包括成功的结果、异常和取消等情况。接下来,我们就详细了解一下这个类。...super Throwable> action);这几个方法都是用来在CompletableFuture完成后进行下一步处理,这里使用thenApply举一个例子CompletableFuture<Score...volatile Completion stack; }其中result 用来保存future的结果,stack是利用链表实现的栈,记录了这个future的后续动作,在使用CompletableFuture...有些同学看到这里可能有些疑惑,这种结构为什么不直接使用一个指针,而是使用栈。这是因为CompletableFuture 同时支持多个后续任务。...CompletableFuture 在使用起来十分便捷,但也要注意,由于服务器的cpu核数是有限的,如果使用异步的地方过多,最终也会导致阻塞,各位小伙伴在使用时也多加注意,希望各位小伙伴能点个关注,这对我们是一种很大的鼓励
今天想跟大家来聊一聊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中的使用场景比较多,这里我举一个消息存储的场景。
异步API 与同步API相反,异步API会直接返回,或者至少在被调用方计算完成之前,将它剩余的计算任务交给另一个线程去做,该线程和调用方是异步的。 这就是非阻塞调用。...执行剩余的计算任务的线程将他的计算结果返回给调用方。 返回的方式要么通过回调函数,要么由调用方再此执行一个“等待,指导计算完成”的方法调用。...在这段代码中,创建了一个代表异步计算的 CompletableFuture 对象实例,它在计算完成时会包含计算的结果。...当请求的产品价格最终计算得出时,你可以使用它的 complete 方法,结束completableFuture 对象的运行,并设置变量的值。...为了让客户端能了解商店无法提供请求商品价格的原因,你需要使用 CompletableFuture 的 completeExceptionally 方法将导致 CompletableFuture 内发生问题的异常抛出
在Java中,CompletableFuture 是一个用于异步编程的类,它代表了某个计算的结果,这个计算可能还没有完成。...使用 supplyAsync 处理有返回值的任务supplyAsync 方法接受一个 Supplier 类型的参数,这个 Supplier 应该返回一个结果。...supplyAsync 方法会异步地执行这个 Supplier,并返回一个 CompletableFuture,这个 CompletableFuture 会在计算完成时包含 Supplier 的结果。...但是,如果你想要等待任务完成,可以调用future.join() future.join(); // 等待任务完成,但不会返回结果 }}等待所有请求完成如果你有一组 CompletableFuture...,并且你想要等待它们全部完成,你可以使用 CompletableFuture.allOf 方法。
背景 CompletableFuture的使用是为了异步编程,异步编程可以解决同步编程的性能瓶颈问题。也就是将同步操作变为了并行操作。...当我们有一大批数据需要处理的时候我们可以将这些数据分而治之,使用CompletableFuture通过线程池的多个线程进行异步执行。...CompletableFuture介绍 在1.8之前我们使用多线程操作的方法是通过CallAble来实现call方法,然后通过future获得异步的结果,其中要么是使用get()方法进行阻塞,我么轮训IsDone...计算结果完成时回掉方法 当我们异步调用完成调用后,计算结果完成或者异常的时候我们应该如何接受结果呢?...总结 CompletableFuture的由来 还有CompleteTableTuture的异步提交,接受任务结果,接受任务结果且处理,任务完成执行等。 部分方法
一、在Android中的使用 1.gradle依赖 implementation "io.reactivex.rxjava2:rxjava:2.0.8" implementation '...接下来就来分析一下为什么 (其实java中如果在 supplyAsync 里面添加了 Thread.sleep 也可以得到和 android 一样的结果,原因不明) 其实有了上面的使用基本也就知道了...= null) { dep = null; fn = null; if (d.result == null) {//没有结果就等待结果...} } d.postComplete(); } } 很简单,先计算结果...等待 get 完成并且做点扫尾工作,然后 h.tryFire 下一个 CompletableFuture thenApply CompletableFuture d = newIncompleteFuture
领取专属 10元无门槛券
手把手带您无忧上云