【CompletableFuture】CompletableFuture中join()和get()方法的区别相同点: join()和get()方法都是阻塞调用它们的线程(通常为主线程)来获取CompletableFuture...异步之后的返回值。...这里再强调一下:CompletableFuture.get() 和 CompletableFuture.join() 这两个方法是获取异步守护线程的返回值的。...ps: stage就是 CompletionStage 也就是 CompletableFuture 实现的接口,意思就是每一个 CompletableFuture的任务返回都是一个stage看代码:public...} } 结果:0 Process finished with exit code 0把注释去掉后结果: 2530 Process finished with exit code 0不同点:get() 方法会抛出经检查的异常
,耗时为3北+5北+3北 = 11北ms,可以看到Future➕自定义线程池异步的确提高了执行效率,但是Future对结果的获取不是很友好,只能通过阻塞和轮训得到结果, Future.get()在没有得到结果之前一直是阻塞状态...thenApplySync 和函数式接口Sfunction用法一样,thenApply方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,并且回调方法是有返回值的...whenComplete whenComplete方法表示,某个任务执行完成后,执行的回调方法,无返回值;并且whenComplete方法返回的CompletableFuture的result是上个任务的结果...区别在于: thenCombine:会将两个任务的执行结果作为方法入参,传递到指定方法中,且有返回值 thenAcceptBoth: 会将两个任务的执行结果作为方法入参,传递到指定方法中,且无返回值 runAfterBoth...applyToEither:会将已经执行完成的任务,作为方法入参,传递到指定方法中,且有返回值 acceptEither: 会将已经执行完成的任务,作为方法入参,传递到指定方法中,且无返回值 runAfterEither
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...CompletableFuture的stack数据结构中,在任务执行完毕之后,回执行对应stack中的Completion回调方法,每个操作基本上都对应有Completion处理类。
) 使用指定的线程池执行任务,有返回值 @FunctionalInterface public interface Supplier { T get(); } Supplier在《用好强大的...()); 计算结果完成时 方法名 whenComplete(BiConsumer<?...whenComplete的任务 whenCompleteAsync:把whenCompleteAsync这个任务提交给线程池来执行 CompletableFuture的所有方法的定义和whenComplete...(future.get()); 转换,消费,执行 方法名 描述 thenApply 获取上一个任务的返回,并返回当前任务的值 thenAccept 获取上一个任务的返回,单纯消费,没有返回值 thenRun...(t); }); 组合(只需要一个任务完成) 方法名 描述 applyToEither 两个任务有一个执行完成,获取它的返回值,处理任务并返回当前任务的返回值 acceptEither 两个任务有一个执行完成
我们还是像之前一样设定任务,然后再调用whenComplete()方法。在这个方法里面,我们可以判断在执行任务过程中是否有异常。但是,当我们运行代码之后,会发现有问题,并没有输出结果。...CompletionStage接口代表了异步计算过程中的一个阶段,它定义了一组方法来处理这个阶段的完成情况和结果。在我们的示例中,whenComplete()方法被用来处理异步任务完成后的情况。...1.获取结果和触发计算 让我们重点关注getNow()和complete()这两个方法,因为在之前的案例中,我们已经体验了CompletableFuture的其他几种方法。...这种串行化的处理方式就像我们之前讨论的烤肉过程一样,需要一步一步地按顺序进行。然而,它们在处理异常方面有所不同。...基本方法 whenComplete()方法是CompletableFuture中的一个非阻塞性方法,它不会像get()方法那样导致线程阻塞,从而提供了更好的性能表现。
还能做一些之前说的executorService配合futures做不了的。 之前future需要等待isDone为true才能知道任务跑完了。或者就是用get方法调用的时候会出现阻塞。...2.JDK1.8使用的接口类。在本文的CompletableFuture中大量的使用了这些函数式接口。 注:这些声明大量应用于方法的入参中。...带有supply是持有返回值的,run是void返回值的。在玩supply时发现一个问题如果使用supplyAsync任务时不使用任务的返回值。即不用get方法阻塞主线程会导致任务执行中断。...如果调用的中途没有发生其他任务且在触碰到whenComplete方法时completableFuture这个任务还没有彻底执行完毕那么就会用completableFuture这个任务所使用的线程。...注:whenComplete中出现的问题在then中测试不存在、使用的就是上一个任务的线程。这个thenCompose就是一个任务执行完之后可以用它的返回结果接着执行的方法。
CompletableFuture介绍 在1.8之前我们使用多线程操作的方法是通过CallAble来实现call方法,然后通过future获得异步的结果,其中要么是使用get()方法进行阻塞,我么轮训IsDone...于是在1.8的引入了CompletableFuture,他是针对future做了改进。通过example来看一下具体的使用 CompletableFuture的主要方法 1....下面有四种接受的方法 public CompletableFuture whenComplete(BiConsumer<? super T,?...whenComplete 和 whenCompleteAsync 的区别: whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。...Process finished with exit code 0 我们可以想一下应用场景,在我们下了订单之后我们给用户返回抽奖的场景。
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) 以上方法都是在方法中返回一个值
CompletableFuture 的底层实现是基于 Fork/Join 框架和 ConcurrentLinkedQueue ,在Java 8中, CompletableFuture 是在 java.util.concurrent...我们创建了一个 CompletableFuture 对象,它使用 runAsync() 方法执行了一个不需要返回值的操作。...注意,这个操作是在新的线程中执行的,因此不会阻塞主线程。 可以通过调用 future.join() 来等待这个异步任务的完成。如果不需要等待任务的完成,可以直接返回 future 对象。...whenComplete 这些方法的使用方式相似,都是通过链式调用的方式,如下示例: CompletableFuture future = CompletableFuture.supplyAsync...whenComplete 方法会在 future 任务完成后,执行 whenComplete 中的代码,无论成功或失败都会执行。
你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。 ...在Java 8中, 新增加了一个包含50个方法左右的类: CompletableFuture,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果...没有指定Executor的方法会使用ForkJoinPool.commonPool() 作为它的线程池执行异步代码。 runAsync方法不支持返回值。...thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前任务的返回值。...我们需要等待每个任务执行完毕之后在返回,所以最后使用allOf方法进行多任务组合。
一般我们用上面的静态方法来创建CompletableFuture,这里也解释下他们的区别: 「supplyAsync」执行任务,支持返回值。 「runAsync」执行任务,没有返回值。...2、thenAccept/thenAcceptAsync 第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,但是回调方法是没有返回值的。...,传递到回调方法中,并且回调方法是有返回值的。...「正常完成」:whenComplete返回结果和上级任务一致,异常为null; 「出现异常」:whenComplete返回结果为null,异常为上级任务的异常; 即调用get()时,正常完成时就获取到结果...2、CompletableFuture的get()方法是阻塞的 CompletableFuture的get()方法是阻塞的,如果使用它来获取异步调用的返回值,需要添加超时时间。
之前介绍了那么多并发编程的内容,还有什么问题不能解决?CompletableFuture到底能解决什么问题?与之前介绍的内容有什么关系?具体如何使用?基本原理是什么?...whenComplete的返回值还是CompletableFuture,它不会改变原阶段的结果,还可以在其上继续调用其他函数。...handle whenComplete只是注册回调函数,不改变结果,它返回了一个CompletableFuture,但这个CompletableFuture的结果与调用它的CompletableFuture...extends U> fn) 回调函数是一个BiFunction,也是接受两个参数,一个是正常结果,另一个是异常,但BiFunction有返回值,在handle返回的CompletableFuture...thenRun指定的下一个任务类型是Runnable,它不需要前一个阶段的结果作为参数,也没有返回值,所以,在thenRun返回的CompletableFuture中,结果类型为Void,即没有结果。
// 在异步操作完成的时候对异步操作的结果进行一些操作,并且仍然返回 CompletableFuture 类型。...whenComplete 计算结果完成时的处理 whenComplete 方法主要作用:当运行完成时,对结果的记录。...因此这组方法兼有 whenComplete 和转换的两个功能。...果下一个 Stage 接收了当前 Stage 的结果但是在计算中无需返回值(比如其返回值为 void),那么它将使用方法 thenAccept 并传入一个 Consumer 接口。...CompletionStage,无论之前的 Stage 是否正常运行完毕。
你可以使用`isDone`方法检查计算是否完成,或者使用`get`阻塞住调用线程,直到计算完成返回结果,你也可以使用`cancel`方法停止任务的执行。...在 Java 8 中, 新增加了一个包含 50 个方法左右的类: CompletableFuture,提供了非常强大的Future 的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,...可以 通过回调的方式处理计算结果,并且提供了转换和组合 CompletableFuture 的方法。...whenComplete 和 whenCompleteAsync 的区别: whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。...同之前。 thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前 任务的返回值。
isCanceled():判断任务是否被取消,如果任务在结束(正常执行结束或者执行异常结束)前被取消则返回true,否则返回false。...,所以在JDK8时推出了CompletableFuture实现异步编排。...");复制代码创建一个返回结果类型为String的CompletableFuture,可以使用Future接口的get()方法获取该值(同样也会阻塞)。...super Throwable> action)复制代码在创建好的初始任务或者是上一个任务后通过链式调用该方法,会在之前任务执行完成后继续执行whenComplete里的内容(whenComplete传入的...action只是对之前任务的结果进行处理),即使用该方法可以避免前面说到的Future接口的问题,不再需要通过阻塞或者轮询的方式去获取结果,而是通过调用该方法等任务执行完毕自动调用。
异步等待CompletableFuture的完成,并回调方法。...Throwable throwable) { return "exception"; } }); // thenAccept方法传入的函数只有在...写个尽量完整的例子,看下各个方法是如何结合在一起使用的。...); // 将future放入map中 futureMap.put(futureID, f); // 通知remote加载数据并将结果以回调remoteDataLoaded方法的形式返回...,但基本上可以展示CompletableFuture在项目中如何使用,当然,CompletableFuture还有更加复杂和强大的用法,这里就不一一介绍了,感兴趣的朋友可以点击阅读原文,查看其完整的api
CompletableFuture常见api详解 CompletableFuture的方法api多,但主要可以分为以下几类。...extends V> fn); 这个方法的意思是,当前任务和other任务都执行结束后,拿到这两个任务的执行结果,回调 BiFunction ,然后返回新的结果。...6、以Async结尾的方法 上面说的一些方法,比如说thenAccept方法,他有两个对应的Async结尾的方法,如下: public CompletionStage thenAcceptAsync...super T> action); CompletableFuture在RocketMQ中的使用 CompletableFuture在RocketMQ中的使用场景比较多,这里我举一个消息存储的场景。...在RocketMQ中,Broker接收到生产者产生的消息的时候,会将消息持久化到磁盘和同步到从节点中。 持久化到磁盘和消息同步到从节点是两个独立的任务,互不干扰,可以相互独立执行。
前段时间,阿粉已经说过一次CompletableFuture了,但是还是有读者说,感觉不是很清晰,有点乱的样子,今天阿粉就再来说一下这个CompletableFuture的一些API的方法。...supplyAsync方法 通过该函数创建的CompletableFuture实例会异步执行当前传入的计算任务。在调用端,则可以通过get或join获取最终计算结果。...,那么获取返回结果我们需要调用什么方法呢?...但是这种链式也不是都非常的好用,毕竟要控制住线程池,大家记得在使用完成之后,可以把自己创建的线程池小回调,调用shutDown方法就可以了。我们再接着往下说。...实际上调用的是和之前一样的,但是就是没有返回值了。
(completableFuture.get()); 一旦任务执行完成,就可以打印返回值,这里的使用方法跟Future是一样的。...所以对比两个两种实例化的方法,使用静态方法的和使用构造方法主要区别就是,使用构造方法需要其它线程主动调用complete来表示任务执行完成,因为很简单,因为在构造的时候没有执行异步的任务,所以需要其它线程主动调用...调用此方法时如果你的任务已经完成,那么方法就会返回false;如果任务没完成,就会返回true,并且其它线程获取到的任务的结果就是complete的参数值。...whenComplete:能接受正常或者异常的回调,并且不影响上个阶段的返回值,也就是主线程能获取到上个阶段的返回值;当出现异常时,whenComplete并不能吞了这个异常,也就是说主线程在获取执行异常任务的结果时...当然,还有一些其它的api,可以自行查看 CompletableFuture在RocketMQ中的使用 CompletableFuture在RocketMQ中的使用场景比较多,这里我举一个消息存储的场景
一、简介 所谓异步调用其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法。...在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。 ...(supplyAsync.get()); } } 2. whenComplete、exceptionally // 执行完成时,当前任务的线程执行继续执行 whenComplete 的任务。...extends T> fn) 当 CompletableFuture 的计算完成时,会执行 whenComplete 方法;当 CompletableFuture 计算中抛出异常时,会执行 exceptionally...无返回结果。 thenRun 跟 thenAccept 方法不一样的是,不关心任务的处理结果。只要上面的任务执行完成,就开始执行 thenRun。
领取专属 10元无门槛券
手把手带您无忧上云