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

CompletableFuture详解

,耗时为3北+5北+3北 = 11北ms,可以看到Future➕自定义线程池异步的确提高了执行效率,但是Future对结果获取不是很友好,只能通过阻塞和轮训得到结果, Future.get()没有得到结果之前一直是阻塞状态...thenApplySync 和函数式接口Sfunction用法一样,thenApply方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将该任务执行结果,作为入参,传递到回调方法中,并且回调方法是有返回...whenComplete whenComplete方法表示,某个任务执行完成后,执行回调方法,无返回值;并且whenComplete方法返回CompletableFutureresult是上个任务结果...区别在于: thenCombine:会将两个任务执行结果作为方法入参,传递到指定方法中,且有返回值 thenAcceptBoth: 会将两个任务执行结果作为方法入参,传递到指定方法中,且无返回值 runAfterBoth...applyToEither:会将已经执行完成任务,作为方法入参,传递到指定方法中,且有返回值 acceptEither: 会将已经执行完成任务,作为方法入参,传递到指定方法中,且无返回值 runAfterEither

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

CompletableFuture 原理浅析

Java8新增了CompletableFuture 提供对异步计算支持,可以通过回调方式处理计算结果,CompletableFuture 类实现了CompletionStage和Future接口,所以还可以像之前使用...当前调用thenApply方法线程(这里是main线程)会对CompletableFuture提交Function(对应是计算s.length()逻辑),那么到底是哪个线程执行计算s.length...下面就按照示例代码照提交supplyAsync、提交thenApply、执行whenComplete流程来进行分析,注意 CompletableFuture 方法大都是返回CompletableFuture...从上图结合 thenApply或者whenComplete 提交Completion,可以看出每种类型方法都对应了一种Completion来处理,多个Completion会被存放到CompletableFuture.stack...CompletableFuturestack数据结构中,在任务执行完毕之后,回执行对应stack中Completion回调方法,每个操作基本上都对应有Completion处理类。

2K20

异步神器CompletableFuture

) 使用指定线程池执行任务,有返回值 @FunctionalInterface public interface Supplier { T get(); } Supplier《用好强大...()); 计算结果完成时 方法whenComplete(BiConsumer<?...whenComplete任务 whenCompleteAsync:把whenCompleteAsync这个任务提交给线程池来执行 CompletableFuture所有方法定义和whenComplete...(future.get()); 转换,消费,执行 方法名 描述 thenApply 获取上一个任务返回,并返回当前任务值 thenAccept 获取上一个任务返回,单纯消费,没有返回值 thenRun...(t); }); 组合(只需要一个任务完成) 方法名 描述 applyToEither 两个任务有一个执行完成,获取它返回值,处理任务并返回当前任务返回值 acceptEither 两个任务有一个执行完成

1.1K20

提高效率,实现异步编程,我用CompletableFuture(下)

我们还是像之前一样设定任务,然后再调用whenComplete()方法。在这个方法里面,我们可以判断执行任务过程中是否有异常。但是,当我们运行代码之后,会发现有问题,并没有输出结果。...CompletionStage接口代表了异步计算过程中一个阶段,它定义了一组方法来处理这个阶段完成情况和结果。我们示例中,whenComplete()方法被用来处理异步任务完成后情况。...1.获取结果和触发计算 让我们重点关注getNow()和complete()这两个方法,因为之前案例中,我们已经体验了CompletableFuture其他几种方法。...这种串行化处理方式就像我们之前讨论烤肉过程一样,需要一步一步地按顺序进行。然而,它们处理异常方面有所不同。...基本方法 whenComplete()方法CompletableFuture一个非阻塞性方法,它不会像get()方法那样导致线程阻塞,从而提供了更好性能表现。

24410

JDK1.8新特性CompletableFuture总结

还能做一些之前executorService配合futures做不了之前future需要等待isDone为true才能知道任务跑完了。或者就是用get方法调用时候会出现阻塞。...2.JDK1.8使用接口类。本文CompletableFuture中大量使用了这些函数式接口。 注:这些声明大量应用于方法入参中。...带有supply是持有返回,run是void返回玩supply时发现一个问题如果使用supplyAsync任务时不使用任务返回值。即不用get方法阻塞主线程会导致任务执行中断。...如果调用中途没有发生其他任务且触碰到whenComplete方法completableFuture这个任务还没有彻底执行完毕那么就会用completableFuture这个任务所使用线程。...注:whenComplete中出现问题在then中测试不存在、使用就是上一个任务线程。这个thenCompose就是一个任务执行完之后可以用它返回结果接着执行方法

38310

CompletableFuture 应用实践

Async方法是交给其他线程执行action(如果是线程池,执行action可能和之前执行异步任务是同一个线程),入参带executor交给executor线程池来执行action动作,当发生异常时...来执行完成动作之外,还可以使用handle方法,该方法可以将上一个CompletableFuture返回类型转换: public CompletableFuture handle(BiFunction...返回类型转换之外,还可以使用thenApply方法,二者不同是前者会处理正常返回值和异常,因此可以屏蔽异常,避免继续抛出;而后者只能处理正常返回值,一旦有异常就会抛出。...CompletableFuture类型,如果是指为了执行某些消费动作而不返回CompletableFuture类型,则可以使用thenAccept方法。...(Runnable action) public CompletableFuture thenRunAsync(Runnable action, Executor executor) 以上方法都是方法返回一个值

63410

如何使用CompletableFuture

CompletableFuture 底层实现是基于 Fork/Join 框架和 ConcurrentLinkedQueue ,Java 8中, CompletableFuture java.util.concurrent...我们创建了一个 CompletableFuture 对象,它使用 runAsync() 方法执行了一个不需要返回操作。...注意,这个操作是线程中执行,因此不会阻塞主线程。 可以通过调用 future.join() 来等待这个异步任务完成。如果不需要等待任务完成,可以直接返回 future 对象。...whenComplete 这些方法使用方式相似,都是通过链式调用方式,如下示例: CompletableFuture future = CompletableFuture.supplyAsync...whenComplete 方法会在 future 任务完成后,执行 whenComplete代码,无论成功或失败都会执行。

18830

CompletableFuture异步编排

你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务执行。   ...Java 8中, 新增加了一个包含50个方法左右类: CompletableFuture,提供了非常强大Future扩展功能,可以帮助我们简化异步编程复杂性,提供了函数式编程能力,可以通过回调方式处理计算结果...没有指定Executor方法会使用ForkJoinPool.commonPool() 作为它线程池执行异步代码。 runAsync方法不支持返回值。...thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回结果,并返回当前任务返回值。...我们需要等待每个任务执行完毕之后返回,所以最后使用allOf方法进行多任务组合。

73720

CompletableFuture 异步多线程,那叫一个优雅

一般我们用上面的静态方法来创建CompletableFuture,这里也解释下他们区别: 「supplyAsync」执行任务,支持返回值。 「runAsync」执行任务,没有返回值。...2、thenAccept/thenAcceptAsync 第一个任务执行完成后,执行第二个回调方法任务,会将该任务执行结果,作为入参,传递到回调方法中,但是回调方法是没有返回。...,传递到回调方法中,并且回调方法是有返回。...「正常完成」:whenComplete返回结果和上级任务一致,异常为null; 「出现异常」:whenComplete返回结果为null,异常为上级任务异常; 即调用get()时,正常完成时就获取到结果...2、CompletableFutureget()方法是阻塞 CompletableFutureget()方法是阻塞,如果使用它来获取异步调用返回值,需要添加超时时间。

96120

(94) 组合式异步编程 计算机程序思维逻辑

之前介绍了那么多并发编程内容,还有什么问题不能解决?CompletableFuture到底能解决什么问题?与之前介绍内容有什么关系?具体如何使用?基本原理是什么?...whenComplete返回值还是CompletableFuture,它不会改变原阶段结果,还可以在其上继续调用其他函数。...handle whenComplete只是注册回调函数,不改变结果,它返回了一个CompletableFuture,但这个CompletableFuture结果与调用它CompletableFuture...extends U> fn) 回调函数是一个BiFunction,也是接受两个参数,一个是正常结果,另一个是异常,但BiFunction有返回值,handle返回CompletableFuture...thenRun指定下一个任务类型是Runnable,它不需要前一个阶段结果作为参数,也没有返回值,所以,thenRun返回CompletableFuture中,结果类型为Void,即没有结果。

62771

CompletableFuture 异步编排

你可以使用`isDone`方法检查计算是否完成,或者使用`get`阻塞住调用线程,直到计算完成返回结果,你也可以使用`cancel`方法停止任务执行。... Java 8 中, 新增加了一个包含 50 个方法左右类: CompletableFuture,提供了非常强大Future 扩展功能,可以帮助我们简化异步编程复杂性,提供了函数式编程能力,...可以 通过回调方式处理计算结果,并且提供了转换和组合 CompletableFuture 方法。...whenComplete 和 whenCompleteAsync 区别: whenComplete:是执行当前任务线程执行继续执行 whenComplete 任务。...同之前。  thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回结果,并返回当前 任务返回值。

17750

CompletableFuture实现异步编排

isCanceled():判断任务是否被取消,如果任务结束(正常执行结束或者执行异常结束)前被取消则返回true,否则返回false。...,所以JDK8时推出了CompletableFuture实现异步编排。...");复制代码创建一个返回结果类型为StringCompletableFuture,可以使用Future接口get()方法获取该值(同样也会阻塞)。...super Throwable> action)复制代码创建好初始任务或者是上一个任务后通过链式调用该方法,会在之前任务执行完成后继续执行whenComplete内容(whenComplete传入...action只是对之前任务结果进行处理),即使用该方法可以避免前面说到Future接口问题,不再需要通过阻塞或者轮询方式去获取结果,而是通过调用该方法等任务执行完毕自动调用。

1.5K10

CompletableFutureRocketMQ中使用实战!

CompletableFuture常见api详解 CompletableFuture方法api多,但主要可以分为以下几类。...extends V> fn); 这个方法意思是,当前任务和other任务都执行结束后,拿到这两个任务执行结果,回调 BiFunction ,然后返回结果。...6、以Async结尾方法 上面说一些方法,比如说thenAccept方法,他有两个对应Async结尾方法,如下: public CompletionStage thenAcceptAsync...super T> action); CompletableFutureRocketMQ中使用 CompletableFutureRocketMQ中使用场景比较多,这里我举一个消息存储场景。...RocketMQ中,Broker接收到生产者产生消息时候,会将消息持久化到磁盘和同步到从节点中。 持久化到磁盘和消息同步到从节点是两个独立任务,互不干扰,可以相互独立执行。

11110

一网打尽异步神器CompletableFuture

(completableFuture.get()); 一旦任务执行完成,就可以打印返回值,这里使用方法跟Future是一样。...所以对比两个两种实例化方法,使用静态方法和使用构造方法主要区别就是,使用构造方法需要其它线程主动调用complete来表示任务执行完成,因为很简单,因为构造时候没有执行异步任务,所以需要其它线程主动调用...调用此方法时如果你任务已经完成,那么方法就会返回false;如果任务没完成,就会返回true,并且其它线程获取到任务结果就是complete参数值。...whenComplete:能接受正常或者异常回调,并且不影响上个阶段返回值,也就是主线程能获取到上个阶段返回值;当出现异常时,whenComplete并不能吞了这个异常,也就是说主线程获取执行异常任务结果时...当然,还有一些其它api,可以自行查看 CompletableFutureRocketMQ中使用 CompletableFutureRocketMQ中使用场景比较多,这里我举一个消息存储场景

58810

Java8 CompletableFuture 编程

一、简介  所谓异步调用其实就是实现一个无需等待被调用函数返回值而让操作继续运行方法。... Java 语言中,简单讲就是另启一个线程来完成调用中部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程计算结果。  ...(supplyAsync.get()); } } 2. whenComplete、exceptionally // 执行完成时,当前任务线程执行继续执行 whenComplete 任务。...extends T> fn) 当 CompletableFuture 计算完成时,会执行 whenComplete 方法;当 CompletableFuture 计算中抛出异常时,会执行 exceptionally...无返回结果。 thenRun 跟 thenAccept 方法不一样是,不关心任务处理结果。只要上面的任务执行完成,就开始执行 thenRun。

1K10
领券