一般我们用上面的静态方法来创建CompletableFuture,这里也解释下他们的区别: 「supplyAsync」执行任务,支持返回值。 「runAsync」执行任务,没有返回值。...2、thenAccept/thenAcceptAsync 第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,但是回调方法是没有返回值的。...,传递到回调方法中,并且回调方法是有返回值的。...区别在于: 「runAfterBoth」 不会把执行结果当做方法入参,且没有返回值 「thenAcceptBoth」: 会将两个任务的执行结果作为方法入参,传递到指定方法中,且无返回值 「thenCombine...区别在于: 「runAfterEither」:不会把执行结果当做方法入参,且没有返回值 「acceptEither」: 会将已经执行完成的任务,作为方法入参,传递到指定方法中,且无返回值 「applyToEither
因此,从 Java 8 开始引入了CompletableFuture,它针对Future做了很多的改进,在实现Future接口相关功能之外,还支持传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象方法...有返回值 whenComplete()/whenCompleteAsync():它表示任务执行完成后的回调方法,有入参,无返回值 handle()/handleAsync():它表示任务执行完成后的回调方法...,thenRun()方法没有回调。...,表示任务执行完成后的回调方法,有入参,无返回值。...,表示任务执行完成后的回调方法,有入参,有返回值。
3s,然后调用future的complete方法模拟主线程等待的条件完成,这时候主线程就会从get()方法返回。...在oneFuture上调用thenRun方法添加异步执行事件,当oneFuture计算完成后回调该事件,并返回twoFuture,另外,在twoFuture上调用get()方法也会返回null,因为回调事件是没有返回值的...需要注意的是,这里可以在回调的方法accept(String t)的参数t中来获取oneFuture对应的任务结果,另外需要注意的是,由于accept(String t)方法没有返回值,所以在twoFuture...get()方法最终也会返回回调方法返回的值。...doSomethingOne(“123”)开启了一个异步任务,并返回了对应的CompletableFuture对象,我们取名为future1,然后在future1的基础上调用了thenCompose方法
某个任务执行完成后,执行回调方法;但是前后两个任务没有参数传递,第二个任务也没有返回值 public static void main(String[] args) throws ExecutionException...thenApplySync 和函数式接口Sfunction用法一样,thenApply方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,并且回调方法是有返回值的...whenComplete whenComplete方法表示,某个任务执行完成后,执行的回调方法,无返回值;并且whenComplete方法返回的CompletableFuture的result是上个任务的结果...applyToEither:会将已经执行完成的任务,作为方法入参,传递到指定方法中,且有返回值 acceptEither: 会将已经执行完成的任务,作为方法入参,传递到指定方法中,且无返回值 runAfterEither...,所以两个任务的返回值应该一样 AllOf 所有任务都执行完成后,才执行 allOf返回的CompletableFuture。
调用 get() 方法会阻塞程序 Future 不会通知你它的完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止,没有办法利用回调函数附加到Future,并在Future的结果可用时自动调用它...基本方法已经罗列的差不多了,接下来我们通过一些例子来实际演示一下: 案例演示 创建一个 CompletableFuture 对象 创建一个 CompletableFuture 对象并没有什么稀奇的,依旧是通过构造函数构建...supplyAsync 使用 runAsync 是没有返回结果的,我们想获取异步计算的返回结果需要使用 supplyAsync() 方法 CompletableFuture future...我们已经多次说过,get() 方法在Future 计算完成之前会一直处在 blocking 状态下,对于真正的异步处理,我们希望的是可以通过传入回调函数,在Future 结束时自动调用该回调函数,这样,...CompletableFuture voidCompletableFuture = CompletableFuture.supplyAsync( // 模拟远端API调用,这里只返回了一个构造的对象
某个任务执行完成后,执行回调方法;但是前后两个任务没有参数传递,第二个任务也没有返回值 public class FutureThenRunTest { public static void...传递到回调方法中,但是回调方法是没有返回值的。...的thenApply方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,并且回调方法是有返回值的。...的whenComplete方法表示,某个任务执行完成后,执行的回调方法,无返回值;并且whenComplete方法返回的CompletableFuture的result是上个任务的结果。...666 233333 捡田螺的小男孩 6. handle方法 CompletableFuture的handle方法表示,某个任务执行完成后,执行回调方法,并且是有返回值的;并且handle方法返回的
Future 对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到结果 面对一些复杂的任务 对于简单的业务场景使用 Future 接口完全 OK 回调通知 应对 Future 的完成时间,完成之后发起回调通知...get()方法在 Future 计算完成之前会一直处于阻塞状态下 isDone()方法容易耗费 CPU 资源 对于真正在异步处理中我们希望可以通过传入回调函数,在 Future 结束时自动回调该函数,这样就不需要等待结果...的功能增强版,减少阻塞和轮询, 可以传入回调对象,当异步任务完成或者发生异常时,自动回调对象的回调方法 使用 CompletableFuture 实现 Future 的功能 CompletableFuture...的优点 异步任务结束时,会自动调用对象的方法 主线程设置好回调之后,不在关系异步任务的执行,异步任务之间可以顺序进行 异步任务出错时,会自动调用某个对象的方法 try {...(面试必备) 大厂业务需求说明 切记,先完成功能再到性能的逐步迭代 电商网站比价需求分析 案例说明:电商比价需求,模拟如下情况: 1.
实现异步回调:通过CompletableFuture的回调方法,可以在异步任务完成后执行特定的逻辑,比如通知其他系统、记录日志等。...supplyAsync:启动一个异步任务,并返回一个CompletableFuture对象,该任务会在传入的Supplier中执行。...在这个例子中,第一个CompletableFuture启动了一个异步任务,模拟了一个耗时的操作,然后返回一个整数结果。 exceptionally:处理上一个阶段执行过程中出现的异常,返回一个默认值。...thenApply:对上一个阶段的结果进行处理,并返回一个新的CompletableFuture对象。...join:等待CompletableFuture的完成并获取结果。在这个例子中,通过调用join方法等待所有任务完成,并获取它们的结果。
异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就可以使用异步,提高效率、加快程序的响应。而我们今天探讨的话题就是Java中的异步编程。...,线程池会返回一个 Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功,并且可以通过 Future 的 get()方法来获取返回值。...提供了大量的接口方法,他们让CompletableFuture拥有了出色的函数式编程能力,方法太多,我们无法一一讲解,只能通过对上面测试源码进行调优时,去使用,使用到的解释一下哈。...它的作用是将前一个任务的返回结果作为下一个任务的输入参数,从而形成一个依赖关系。注意:这个方法是非阻塞的,即查询酒店的操作会立即开始,而不需要等待查询交通方案的操作完成。...3)thenApply():thenApply() 方法接受一个 Function 实例,用它来处理结果;4)allOf() :方法会等到所有的 CompletableFuture 都运行完成之后再返回
在这个例子中,我们模拟了一个耗时操作,通过TimeUnit.SECONDS.sleep(2)暂停了2秒钟。 然后,我们添加了一个回调方法resultFuture。...它返回一个新的CompletableFuture对象,该对象没有返回值。...CompletableFuture对象作为参数,并返回一个新的CompletableFuture对象,该对象在所有给定的CompletableFuture都完成时完成。...方法与allOf类似,不同之处在于它返回的CompletableFuture对象在任何一个给定的CompletableFuture完成时就完成。...如果没有任何依赖任务,或者所有依赖任务已经完成,则返回的数量为0。
CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。...这些方法包括创建异步任务、任务异步回调、多个任务组合处理等方面。...支持返回值 runAsync执行CompletableFuture任务,没有返回值。...没有返回值,输出null System.out.println(runFuture.join()); //supplyAsync的future,有返回值...CompletableFuture的get()方法是阻塞的,如果使用它来获取异步调用的返回值,需要添加超时时间~ //反例 CompletableFuture.get(); //正例 CompletableFuture.get
执行剩余的计算任务的线程将他的计算结果返回给调用方。 返回的方式要么通过回调函数,要么由调用方再此执行一个“等待,指导计算完成”的方法调用。...用 delay 方法模拟这些长期运行的方法的执行,模拟执行1S ,方法声明如下。...在这段代码中,创建了一个代表异步计算的 CompletableFuture 对象实例,它在计算完成时会包含计算的结果。...当请求的产品价格最终计算得出时,你可以使用它的 complete 方法,结束completableFuture 对象的运行,并设置变量的值。...实际上这非常简单, Future 执行完毕可以发出一个通知,仅在计算结果可用时执行一个由Lambda表达式或者方法引用定义的回 调函数。
下面先来看rpcSyncCall方法,该方法意在模拟同步远程调用,其中代码1创建了一个CompletableFuture对象;代码2使用原子变量生成一个请求id,代码3则把业务传递的msg消息体和请求id...组成协议帧;代码4则调用sendMsg方法通过保存的channel对象把协议帧异步发送出去,该方法是非阻塞的,会马上返回,所以不会阻塞业务线程;代码5把代码1创建的future对象保存到FutureMapUtil...现在我们再来看rpcAsyncCall异步调用,其代码实现与同步的rpcSyncCall类似,只不过其没有同步等待future有结果值,而是直接将future返回给调用方,然后就直接返回了,该方法不会阻塞业务线程...代码2调用了异步方法rpcAsyncCall,其不会阻塞业务调用线程,而是马上返回一个CompletableFuture对象,然后我们在其上设置了一个回调函数,意在等future对象的结果被设置后进行回调...Flowable流对象,但这时真正的rpc调用还没有发出去,等代码3订阅了流对象时才真正发起rpc调用。
CompletableFuture allOf(CompletableFuture... cfs) { // ... } 这个方法接受若干个返回不同类型的CompletableFuture为参数...也就是说,这个方法其实就是返回一个在所有参数完成之后也完成的返回为空(Void)的CompletableFuture,也就是充当一个signaling device 这个方法很好,尤其是并发获取多种io...但是用这个方法,带来了很多不便,最大的不便就是,返回是Void,而不是所有的参数的返回。这样导致我们,需要在聚合这些结果的那个服务方法里面,把最终结果封装好,否则,获取的就是一个Void。...举个例子: 假设我的一个服务方法的返回是多个接口在使用,这个方法需要同时调用三个io等待他们都返回时,利用这三个io的返回,拼装成接口需要的字段。...对于这个场景,我们可以有两种写法,第一种是基于回调的写法,第二种是基于返回的写法,两种都OK,看个人习惯,我个人倾向于基于返回的写法,这样代码是瀑布式的,基于回调的会导致多层嵌套,导致代码可读性降低。
但是显然还有几个问题: Future提供了isDone()方法用来判断当前异步任务是否完成,不支持回调方法。而当你需要任务执行结束后就去做其他操作,就得不断的判断isDone()是否结束。...thenApply()方法接受一个Function函数式接口作为参数,用于对前一个任务的结果进行转换或处理,并返回一个新的CompletableFuture对象,表示转换后的结果。...然后使用 thenCompose() 方法,将第二个任务 future2 的结果与第一个任务 future1 的结果进行组合,并返回一个新的 CompletableFuture 对象 combinedFuture...在示例中,我们使用 lambda 表达式将两个结果进行连接并返回。 3.3.4、异步任务编排之allOf() 等待任务1和任务2完成后,调用回调方法。...在异常发生时,exceptionally()方法会执行传入的函数,并返回一个新的CompletableFuture对象,该对象包含了处理异常后的结果(在这个例子中,我们返回了一个默认值 0)。
():表示任务是否已经完成,如果完成,返回true get():获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回 get(long timeout, TimeUnit unit):用来获取执行结果.../ nodo } finally { executorService.shutdown(); } } } Future 表示一个可能还没有完成的异步任务的结果...相对阻塞式等待返回结果,CompletableFuture 可以通过回调的方式来处理计算结果,实现了异步非阻塞,性能更优。...优点: 异步任务结束时,会自动回调某个对象的方法 异步任务出错时,会自动回调某个对象的方法 主线程设置好回调后,不再关心异步任务的执行 泡茶示例: (内容摘自:极客时间的《Java 并发编程实战》)...")); } } 在异步处理的方法上添加注解 @Async ,当对 execute 方法 调用时,通过自定义的线程池 defaultThreadPoolExecutor 异步化执行 execute
待解决的问题(或者需求) 想完成一些复杂的任务 应对Future的完成时间,完成了可以告诉我,也就是我们的回调通知 将两个异步计算合成一个异步计算,这两个异步计算互相独立,同时第二个又依赖第一个的结果...没有指定Executor的方法,直接使用默认的ForkJoinPool.commonPool() 作为它的线程池执行异步代码。...从Java8开始引入了CompletableFuture,它是Future的功能增强版,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法 demo public static...上面的实现方法,类似于前端的.then()~ CompletableFuture的优点 异步任务结束时,会自动回调某个对象的方法; 异步任务出错时,会自动回调某个对象的方法; 异步任务出错时,会自动回调某个对象的方法...) 过时不候(超时) public T getNow(T valueIfAbsent) 没有计算完成的情况下,给我一个替代结果 立即获取结果不阻塞 计算完,返回计算完成后的结果 没算完
比Future多出了流式计算,返回值,异步回调,多Future组合的功能。...# 适用场景 某个接口不好修改,又没有提供批量的方法时 需要异步调用接口时 CPU密集型任务,计算场景多,或多个不关联的接口需要同时调用时 # 场景一 问题:系统中存量老接口,逻辑复杂,改造成本大。...,这是因为如果使用java的主线程方法测试,那么运行结束后,程序就退出了,异步线程自然也就没有了。...对于Web项目,调用该方法时,只是主线程结束,但程序没有退出,异步线程依旧可以运行 # 场景三 问题:多个不相关的任务,并行计算 解决方案:多个CompletableFuture异步计算,使用allOf...cf4,如果有一个任务异常终止,则cf4.get时会抛出异常,都是正常执行,cf4.get返回null //anyOf是只有一个任务执行完成,无论是正常执行或者执行异常,都会执行cf4,cf4.get的结果就是已执行完成的任务的执行结果
Java的Future实现类并没有支持异步回调,仍然需要主动获取耗时任务的结果,而Java8的CompletableFuture组件实现了异步回调模式。 ... 可以为CompletionStage子任务设置特定的回调钩子,当计算结果完成或者抛出异常的时候,执行这些特定的回调钩子。 ...设置子任务回调钩子的主要函数如下: //设置子任务完成时的回调钩子 public CompletableFuture whenComplete( BiConsumer<?...CompletableFuture时,任务被视为异常完成,completeExceptionally()方法所设置的异常回调钩子也会被执行。 ...thenApply()的返回值就是第二个任务的普通异步方法的执行结果,它的返回类型与第二不执行的普通异步方法的返回类型相同,通过thenApply()所返回的值不能进行下一轮CompletionStage
领取专属 10元无门槛券
手把手带您无忧上云