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

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

一般我们用上面的静态方法来创建CompletableFuture,这里也解释下他们区别: 「supplyAsync」执行任务,支持返回值。 「runAsync」执行任务,没有返回值。...2、thenAccept/thenAcceptAsync 第一个任务执行完成后,执行第二个回方法任务,会将该任务执行结果,作为入参,传递到回方法中,但是回方法没有返回。...,传递到回方法中,并且回方法是有返回。...区别在于: 「runAfterBoth」 不会把执行结果当做方法入参,且没有返回值 「thenAcceptBoth」: 会将两个任务执行结果作为方法入参,传递到指定方法中,且无返回值 「thenCombine...区别在于: 「runAfterEither」:不会把执行结果当做方法入参,且没有返回值 「acceptEither」: 会将已经执行完成任务,作为方法入参,传递到指定方法中,且无返回值 「applyToEither

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

异步编程 - 05 基于JDK中Future实现异步编程(中)_CompletableFuture

3s,然后调用futurecomplete方法模拟主线程等待条件完成,这时候主线程就会从get()方法返回。...在oneFuture上调用thenRun方法添加异步执行事件,当oneFuture计算完成后回该事件,并返回twoFuture,另外,在twoFuture上调用get()方法也会返回null,因为回事件是没有返回...需要注意是,这里可以在回方法accept(String t)参数t中来获取oneFuture对应任务结果,另外需要注意是,由于accept(String t)方法没有返回值,所以在twoFuture...get()方法最终也会返回方法返回值。...doSomethingOne(“123”)开启了一个异步任务,并返回了对应CompletableFuture对象,我们取名为future1,然后在future1基础上调用了thenCompose方法

22330

CompletableFuture详解

某个任务执行完成后,执行回方法;但是前后两个任务没有参数传递,第二个任务也没有返回值 public static void main(String[] args) throws ExecutionException...thenApplySync 和函数式接口Sfunction用法一样,thenApply方法表示,第一个任务执行完成后,执行第二个回方法任务,会将该任务执行结果,作为入参,传递到回方法中,并且回方法是有返回...whenComplete whenComplete方法表示,某个任务执行完成后,执行方法,无返回值;并且whenComplete方法返回CompletableFutureresult是上个任务结果...applyToEither:会将已经执行完成任务,作为方法入参,传递到指定方法中,且有返回值 acceptEither: 会将已经执行完成任务,作为方法入参,传递到指定方法中,且无返回值 runAfterEither...,所以两个任务返回值应该一样 AllOf 所有任务都执行完成后,才执行 allOf返回CompletableFuture

91920

搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要多图长文

调用 get() 方法会阻塞程序 Future 不会通知你它完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止,没有办法利用回函数附加到Future,并在Future结果可用时自动调用它...基本方法已经罗列差不多了,接下来我们通过一些例子来实际演示一下: 案例演示 创建一个 CompletableFuture 对象 创建一个 CompletableFuture 对象没有什么稀奇,依旧是通过构造函数构建...supplyAsync 使用 runAsync 是没有返回结果,我们想获取异步计算返回结果需要使用 supplyAsync() 方法 CompletableFuture future...我们已经多次说过,get() 方法在Future 计算完成之前会一直处在 blocking 状态下,对于真正异步处理,我们希望是可以通过传入回函数,在Future 结束时自动调用该回函数,这样,...CompletableFuture voidCompletableFuture = CompletableFuture.supplyAsync( // 模拟远端API调用,这里只返回了一个构造对象

1.2K10

异步编程利器:CompletableFuture详解

某个任务执行完成后,执行回方法;但是前后两个任务没有参数传递,第二个任务也没有返回值 public class FutureThenRunTest { public static void...传递到回方法中,但是回方法没有返回。...thenApply方法表示,第一个任务执行完成后,执行第二个回方法任务,会将该任务执行结果,作为入参,传递到回方法中,并且回方法是有返回。...whenComplete方法表示,某个任务执行完成后,执行方法,无返回值;并且whenComplete方法返回CompletableFutureresult是上个任务结果。...666 233333 捡田螺小男孩 6. handle方法 CompletableFuturehandle方法表示,某个任务执行完成后,执行回方法,并且是有返回;并且handle方法返回

99632

有了Future为什么还要CompletableFuture?

Future 对于结果获取不是很友好,只能通过阻塞或轮询方式得到结果 面对一些复杂任务 对于简单业务场景使用 Future 接口完全 OK 回通知 应对 Future 完成时间,完成之后发起回通知...get()方法在 Future 计算完成之前会一直处于阻塞状态下 isDone()方法容易耗费 CPU 资源 对于真正在异步处理中我们希望可以通过传入回函数,在 Future 结束时自动回该函数,这样就不需要等待结果...功能增强版,减少阻塞和轮询, 可以传入回对象,当异步任务完成或者发生异常时,自动回对象方法 使用 CompletableFuture 实现 Future 功能 CompletableFuture...优点 异步任务结束时,会自动调用对象方法 主线程设置好回之后,不在关系异步任务执行,异步任务之间可以顺序进行 异步任务出错时,会自动调用某个对象方法 try {...(面试必备) 大厂业务需求说明 切记,先完成功能再到性能逐步迭代 电商网站比价需求分析 案例说明:电商比价需求,模拟如下情况: 1.

9110

优雅并发编程-CompletableFuture

实现异步回:通过CompletableFuture方法,可以在异步任务完成后执行特定逻辑,比如通知其他系统、记录日志等。...supplyAsync:启动一个异步任务,并返回一个CompletableFuture对象,该任务会在传入Supplier中执行。...在这个例子中,第一个CompletableFuture启动了一个异步任务,模拟了一个耗时操作,然后返回一个整数结果。 exceptionally:处理上一个阶段执行过程中出现异常,返回一个默认值。...thenApply:对上一个阶段结果进行处理,并返回一个新CompletableFuture对象。...join:等待CompletableFuture完成并获取结果。在这个例子中,通过调用join方法等待所有任务完成,并获取它们结果。

48230

实战分析Java异步编程,并通过CompletableFuture进行高效

异步:当应用程序在对象上调用了一个需要花费很长时间来执行方法,并且不希望让程序等待方法返回时,就可以使用异步,提高效率、加快程序响应。而我们今天探讨的话题就是Java中异步编程。...,线程池会返回一个 Future 类型对象,通过这个 Future 对象可以判断任务是否执行成功,并且可以通过 Future get()方法来获取返回值。...提供了大量接口方法,他们让CompletableFuture拥有了出色函数式编程能力,方法太多,我们无法一一讲解,只能通过对上面测试源码进行优时,去使用,使用到解释一下哈。...它作用是将前一个任务返回结果作为下一个任务输入参数,从而形成一个依赖关系。注意:这个方法是非阻塞,即查询酒店操作会立即开始,而不需要等待查询交通方案操作完成。...3)thenApply():thenApply() 方法接受一个 Function 实例,用它来处理结果;4)allOf() :方法会等到所有的 CompletableFuture 都运行完成之后再返回

8710

Java8 - 使用CompletableFuture 构建异步应用

执行剩余计算任务线程将他计算结果返回给调用方。 返回方式要么通过回函数,要么由调用方再此执行一个“等待,指导计算完成方法调用。...用 delay 方法模拟这些长期运行方法执行,模拟执行1S ,方法声明如下。...在这段代码中,创建了一个代表异步计算 CompletableFuture 对象实例,它在计算完成时会包含计算结果。...当请求产品价格最终计算得出时,你可以使用它 complete 方法,结束completableFuture 对象运行,并设置变量值。...实际上这非常简单, Future 执行完毕可以发出一个通知,仅在计算结果可用时执行一个由Lambda表达式或者方法引用定义函数。

93620

异步编程 - 12 异步、基于事件驱动网络编程框架 Netty

下面先来看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调用。

30020

CommpetableFuture使用anyOf过程中一些优化思考

CompletableFuture allOf(CompletableFuture... cfs) { // ... } 这个方法接受若干个返回不同类型CompletableFuture为参数...也就是说,这个方法其实就是返回一个在所有参数完成之后也完成返回为空(Void)CompletableFuture,也就是充当一个signaling device 这个方法很好,尤其是并发获取多种io...但是用这个方法,带来了很多不便,最大不便就是,返回是Void,而不是所有的参数返回。这样导致我们,需要在聚合这些结果那个服务方法里面,把最终结果封装好,否则,获取就是一个Void。...举个例子: 假设我一个服务方法返回是多个接口在使用,这个方法需要同时调用三个io等待他们都返回时,利用这三个io返回,拼装成接口需要字段。...对于这个场景,我们可以有两种写法,第一种是基于回写法,第二种是基于返回写法,两种都OK,看个人习惯,我个人倾向于基于返回写法,这样代码是瀑布式,基于回会导致多层嵌套,导致代码可读性降低。

51720

【JUC基础】15. Future模式

但是显然还有几个问题: Future提供了isDone()方法用来判断当前异步任务是否完成,不支持回方法。而当你需要任务执行结束后就去做其他操作,就得不断判断isDone()是否结束。...thenApply()方法接受一个Function函数式接口作为参数,用于对前一个任务结果进行转换或处理,并返回一个新CompletableFuture对象,表示转换后结果。...然后使用 thenCompose() 方法,将第二个任务 future2 结果与第一个任务 future1 结果进行组合,并返回一个新 CompletableFuture 对象 combinedFuture...在示例中,我们使用 lambda 表达式将两个结果进行连接并返回。 3.3.4、异步任务编排之allOf() 等待任务1和任务2完成后,调用回方法。...在异常发生时,exceptionally()方法会执行传入函数,并返回一个新CompletableFuture对象,该对象包含了处理异常后结果(在这个例子中,我们返回了一个默认值 0)。

10210

聊聊异步编程 7 种实现方式

():表示任务是否已经完成,如果完成返回true get():获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回 get(long timeout, TimeUnit unit):用来获取执行结果.../ nodo } finally { executorService.shutdown(); } } } Future 表示一个可能还没有完成异步任务结果...相对阻塞式等待返回结果,CompletableFuture 可以通过回方式来处理计算结果,实现了异步非阻塞,性能更优。...优点: 异步任务结束时,会自动回某个对象方法 异步任务出错时,会自动回某个对象方法 主线程设置好回后,不再关心异步任务执行 泡茶示例: (内容摘自:极客时间《Java 并发编程实战》)...")); } } 在异步处理方法上添加注解 @Async ,当对 execute 方法用时,通过自定义线程池 defaultThreadPoolExecutor 异步化执行 execute

44620

死磕Juc(一)之CompletableFuture

待解决问题(或者需求) 想完成一些复杂任务 应对Future完成时间,完成了可以告诉我,也就是我们通知 将两个异步计算合成一个异步计算,这两个异步计算互相独立,同时第二个又依赖第一个结果...没有指定Executor方法,直接使用默认ForkJoinPool.commonPool() 作为它线程池执行异步代码。...从Java8开始引入了CompletableFuture,它是Future功能增强版,可以传入回对象,当异步任务完成或者发生异常时,自动调用回对象方法 demo public static...上面的实现方法,类似于前端.then()~ CompletableFuture优点 异步任务结束时,会自动回某个对象方法; 异步任务出错时,会自动回某个对象方法; 异步任务出错时,会自动回某个对象方法...) 过时不候(超时) public T getNow(T valueIfAbsent) 没有计算完成情况下,给我一个替代结果 立即获取结果不阻塞 计算完,返回计算完成结果 没算完

49620

CompletableFuture常用用法及踩坑

比Future多出了流式计算,返回值,异步回,多Future组合功能。...# 适用场景 某个接口不好修改,又没有提供批量方法时 需要异步调用接口时 CPU密集型任务,计算场景多,或多个不关联接口需要同时调用时 # 场景一 问题:系统中存量老接口,逻辑复杂,改造成本大。...,这是因为如果使用java主线程方法测试,那么运行结束后,程序就退出了,异步线程自然也就没有了。...对于Web项目,调用该方法时,只是主线程结束,但程序没有退出,异步线程依旧可以运行 # 场景三 问题:多个不相关任务,并行计算 解决方案:多个CompletableFuture异步计算,使用allOf...cf4,如果有一个任务异常终止,则cf4.get时会抛出异常,都是正常执行,cf4.get返回null //anyOf是只有一个任务执行完成,无论是正常执行或者执行异常,都会执行cf4,cf4.get结果就是已执行完成任务执行结果

1.4K40

CompletableFuture常用用法及踩坑

比Future多出了流式计算,返回值,异步回,多Future组合功能。...# 适用场景 某个接口不好修改,又没有提供批量方法时 需要异步调用接口时 CPU密集型任务,计算场景多,或多个不关联接口需要同时调用时 # 场景一 问题:系统中存量老接口,逻辑复杂,改造成本大。...,这是因为如果使用java主线程方法测试,那么运行结束后,程序就退出了,异步线程自然也就没有了。...对于Web项目,调用该方法时,只是主线程结束,但程序没有退出,异步线程依旧可以运行 # 场景三 问题:多个不相关任务,并行计算 解决方案:多个CompletableFuture异步计算,使用allOf...cf4,如果有一个任务异常终止,则cf4.get时会抛出异常,都是正常执行,cf4.get返回null //anyOf是只有一个任务执行完成,无论是正常执行或者执行异常,都会执行cf4,cf4.get结果就是已执行完成任务执行结果

3.2K31

CompletableFuture异步回

JavaFuture实现类并没有支持异步回,仍然需要主动获取耗时任务结果,而Java8CompletableFuture组件实现了异步回模式。   ...  可以为CompletionStage子任务设置特定钩子,当计算结果完成或者抛出异常时候,执行这些特定钩子。   ...设置子任务回钩子主要函数如下: //设置子任务完成钩子 public CompletableFuture whenComplete( BiConsumer<?...CompletableFuture时,任务被视为异常完成,completeExceptionally()方法所设置异常回钩子也会被执行。   ...thenApply()返回值就是第二个任务普通异步方法执行结果,它返回类型与第二不执行普通异步方法返回类型相同,通过thenApply()所返回值不能进行下一轮CompletionStage

32810
领券