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

CompletableFuture Java多线程操作

, 3 5月 2022 作者 847954981@qq.com 后端学习, 我编程之路 CompletableFuture Java多线程操作 CompletableFuture是Java8中新增加类...意味着会在主线程之外创建一个独立线程,与主线程分隔开,并在上面运行一个非阻塞任务,然后通知主线程成功或者失败。...一种是supply开头方法,一种是run开头方法 supply开头:这种方法,可以返回异步线程执行之后结果 run开头:这种不会返回结果,就只是执行线程任务 或者可以通过一个简单无参构造器 CompletableFuture... completableFuture = new CompletableFuture(); 在实例化方法中,我们是可以指定Executor参数,当我们不指定试话,我们所开并行线程使用是默认系统及公共线程池...我们在编程时候需要谨慎使用守护线程,如果将我们普通用户线程设置成守护线程,当我们程序主线程结束,JVM中不存在其余用户线程,那么CompletableFuture守护线程会直接退出,造成任务无法完成问题

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

03-CompletableFuture异步线程 扩展

用于继续处理上一步线程执行结果(开启新线程去执行)关注返回结果 thenApply 对上一步返回结果做后续处理,传入一个函数式接口,传入x,返回y 对上一步返回结果做后续处理...对上一步返回结果做后续处理(开启新线程去执行)关注返回结果 thenAccept 对上一步结果做后续处理,传入一个消费型接口,传入x 对上一步结果做后续处理(还是上面的线程去执行...x,返回y 用于处理两个线程那个优先完成就用那个返回值(还是上面的线程去执行),传入x就是优先线程返回结果,关注返回值 applyToEitherAsync .....用于处理两个线程那个优先完成就用那个返回值(开启新线程去执行),传入x就是优先线程返回结果,关注返回值 acceptEither 用于处理两个线程那个优先完成,第一个参数就是(第二个线程任务...用于处理两个线程那个优先完成就用那个返回值(开启新线程去执行),传入x就是优先线程返回结果,不关注返回值 runAfterEither 用于处理两个线程那个优先完成,第一个参数就是

20030

01-CompletableFuture异步线程 入门

,这个东西用的人也比较少, 其实也不是很新,是Java8中一个类而已,但是非常好用, 用过多线程的人应该都知道,线程创建,回收,管理,池化,都很难弄, 但是学习了这个东西, 妈妈再也不用担心我用不好多线程了...CompletableFuture是什么 从名称看来和Future有关,没错,他也是Future实现,和FutureTask平级,也是用来实现异步线程任务,并且携带返回值, 具体使用直接从需求出发..., 异步线程,如此简单 需求进化 在餐厅中一般厨师都只负责炒菜,像打饭这样事情都是交给服务员来 需求点:厨师炒完菜后交给服务员,服务员新开线程去打饭 实现 编写代码 @Test public void...,但是估计我这个执行太快了,所以后面的任务也提交给了这个线程,我感觉这种代码调用流程就很清晰,看着像Promise 需求进化 小白进入餐厅时候,开始点菜,要一盘番茄炒蛋+米饭, 但是这个时候米饭是没有蒸好...(BiFunction)返回 第一个任务需求点在于线程开启 第二个任务需求点在于两个线程连接 第三个任务需求点在于两个线程结果合并 怎么样到这里是不是已经简单入门了呢 作者:彼岸舞 时间

18930

02-CompletableFuture异步线程 进阶

继续之前故事线 需求 小白吃完饭后要求服务员开发票, 这个时候小白接到了,回家开黑电话,服务员开好发票后,小白拿着回家了 需求点: 服务员开发票需要异步执行 实现 编写代码 @Test public...void testFour(){ print("小白吃好了"); print("小白 结账,要求开发票"); CompletableFuture cf1 = CompletableFuture.supplyAsync...print("小白吃好了"); print("小白 结账,要求开发票"); CompletableFuture cf1 = CompletableFuture.supplyAsync...,可以看出thenApply和thenCompose方法类似 异步改造 只需要将方法thenApply->thenApplyAsync即可 改造完成后测试,会变成两个线程,但是我还是一样,不知道什么鬼...applyToEither 比较两个线程那个优先运行完成,就用那个结果 exceptionally 处理前面执行中发生异常 怎么样,奇怪知识又增加了 作者

22620

04-CompletableFuture异步线程 性能

场景 场景 方法 任务少, 不频繁 直接使用线程 任务数稳定,频繁 使用线程线程池 优点 不用频繁创建和销毁线程 不需要担心OOM...创建一个无上限线程池(Integer.MAX) newFixedThreadPool 创建一个固定线程线程池 需求 小白和他朋友门,连续输了10几把游戏, 决定去餐厅吃饭了...核心池最大是15, 应为这个和你电脑CPU核心数有关, 我电脑是8核16线程, ForkJoinPool最大线程数 默认应该是最大线程数-1 我们看一下 @Test public void testForkJoinPool...后缀方法, 其实都是可以多传入一个参数,那就是指定线程池, 如果不指定,默认使用线程池就是ForkJoinPool.commonPool从名字也可以看出,这是ForkJoin池 改进一 将通用池线程数设置为合适大小...原因 隔离, 防止影响其他使用ForkJoinPool代码 方便控制, ForkJoinPool在初始化后, 不可以修改, 但是自定义线程池可以在任务数量来之后, 通过计算得出线程数量 这里采用无上限线程池演示

30010

优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy

优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy 问题发现 1 前天大佬通过prometheus发现 tomcat http busy状态线程这几天呈线性递增。...通过jvm自带 jps 命令可以找到服务对应进程ID:66182> 大部分线程都正常,cpu利用率不高,而且线程ID变动快,基本排除 死循环、CPU 空转问题 2:既然不是死循环、CPU空转。...凌晨左右调度了十次,失败了三次,和在prometheus发现 busy http线程增加规律是一致 4 查找代码发现是 CompletableFuture 调用get阻塞住了。...4.1 promethues 监控到线程队列数为空 5 没有任务 CompletableFuture get方法还在执行,查看下 verifiedCodeQueryExecutor 定义。...发现,阻塞队列拒绝策略 是 DiscardPolicy 丢弃。也就是任务丢弃了不被执行,而封装成CompletableFuture 自然就不会有结果返回,因此一直会被阻塞,而改了代码则是超时返回。

76950

优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy

优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy 问题发现 1 前天大佬通过prometheus发现 tomcat http busy状态线程这几天呈线性递增。...通过jvm自带 jps 命令可以找到服务对应进程ID:66182> 大部分线程都正常,cpu利用率不高,而且线程ID变动快,基本排除 死循环、CPU 空转问题 2:既然不是死循环、CPU空转。...凌晨左右调度了十次,失败了三次,和在prometheus发现 busy http线程增加规律是一致 4 查找代码发现是 CompletableFuture 调用get阻塞住了。...4.1 promethues 监控到线程队列数为空 5 没有任务 CompletableFuture get方法还在执行,查看下 verifiedCodeQueryExecutor 定义。...发现,阻塞队列拒绝策略 是 DiscardPolicy 丢弃。也就是任务丢弃了不被执行,而封装成CompletableFuture 自然就不会有结果返回,因此一直会被阻塞,而改了代码则是超时返回。

81050

JUC-Java多线程Future,CompletableFuture

一般情况下不做特别说明配置,默认都是用户线程 用户线程(User Thread): 是系统工作线程,它会完成这个程序需要完成业务条件。...守护线程(Daemon Thread):是一种特殊线程为其它线程服务,在后台默默地完成一些系统性服务 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了 ,如果用户线程全部结束了,意味着程序需要完成业务操作已经结束了...比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,忙其他事情或者执行完,过了一会才去获取子任务执行结果或变更任务状态。...join和get区别 在编译时是否报出检查型异常 CompletableFuture优点 异步任务结束时,会自动回调某个对象方法 主线程设置好回调后,不再关心异步任务执行,异步任务之间可以顺序执行...调用thenRunAsync执行第二个任务时,则第一个任务使用是你自己传入线程池,第二个任务使用是ForkJoinpool线程池 备注:有可能处理太快,系统优化切换原则,直接使用main线程处理

38330

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

调用thenRunAsync执行第二个任务时,则第一个任务使用是你自己传入线程池,第二个任务使用是ForkJoin线程池。...); } 运行结果 //通过结果可以看出,异步任务2都没有执行结束,任务3获取也是1执行结果 异步任务1,当前线程是:17 异步任务1结束 异步任务2,当前线程是:18 执行任务3,当前线程是...代码中又使用了默认「ForkJoin线程池」,处理线程个数是电脑「CPU核数-1」。...4、自定义线程池时,注意饱和策略 CompletableFutureget()方法是阻塞,我们一般建议使用future.get(5, TimeUnit.SECONDS)。...因此建议,CompletableFuture线程池策略最好使用AbortPolicy,然后耗时异步线程,做好线程池隔离哈。

80420

CompletableFuture使用

但是当你用过CompletableFuture之后,就会发现以前线程池处理任务有多难用,功能有多简陋,CompletableFuture又是多么简洁优雅。...反正我发现两个比较严重问题: 获取结果时,调用future.get()方法,会阻塞当前线程,直到返回结果,大大降低性能 有一半代码在写怎么使用线程,其实我们不应该关心怎么使用线程,更应该关注任务处理...代码经过CompletableFuture改造后,是多么简洁优雅。 提交任务也不用再关心线程池是怎么使用了,获取结果也不用再阻塞当前线程了。...3.3 一个线程执行完成,交给另一个线程接着执行 有这么一个需求: 一个线程处理完成,把处理结果交给另一个线程继续处理,怎么实现?...thenApplyAsync()方法,作用就是异步处理上一个线程结果。

42630

Java编码指南:慎用CompletableFuture中不带线程池参数那些方法

---- CompletableFuture提供异步执行方法总是成对 ---- 例如: java.util.concurrent.CompletableFuture#supplyAsync...ForkJoinPool.commonPool() : new ThreadPerTaskExecutor(); CompletableFuture提供异步执行方法,强制使用显示提供线程池 ---...1、默认提供线程池,会使得相关异步执行都共用一个线程池,不合理;而且不能相互隔离业务执行;线程参数也不能改变; 2、默认提供线程池,在微服务spring cloud环境中,会丢失链路信息,...ForkJoinPool,使得线程上下文类加载器ContextClassLoader固定为SystemClassLoader,容易导致类加载失败; 小结 ---- CompletableFuture提供异步执行方法...,强制使用显示提供线程池,能避免上述提到一些问题。

32030

优雅并发编程-CompletableFuture

异步执行耗时操作:对于一些耗时操作,比如远程调用、数据库查询等,可以使用CompletableFuture来异步执行这些操作,避免阻塞主线程,提高系统吞吐量和并发能力。...多线程任务使用案例 我将使用CompletableFuture以下API来说明CompletableFuture使用方法。...,当前服务器环境一般都是多核心、多线程,服务器可以同时处理多个任务,如果此时还使用单线程去执行,有些“暴殄天物”,并且接口响应速度会比较慢,那么优化方式就是开启多个线程去分别执行不同逻辑,那么我们可以使用...单线程和多线程相比,举个不恰当例子:当你为了报仇,踌躇满志上山叩拜师门,经过十年寒窗苦练、不舍昼夜练习,终于学成归来下山复仇,结果仇家拿出AK 47一阵突突,云淡风轻跟你说:“大人,时代变了”无力感...一点小提示 问题 CompletableFuture线程池中执行时,可能会出现代码异常,但是并没有将异常抛出情况,原因有二: 在CompletableFuture异步任务中,如果出现异常而没有显式地处理或抛出

42830

JDK8CompletableFuture

前段时间,阿粉已经说过一次CompletableFuture了,但是还是有读者说,感觉不是很清晰,有点乱样子,今天阿粉就再来说一下这个CompletableFuture一些API方法。...这个有两个不同实现方式,一种是我们传入我们自己创建线程池,然后使用我们创建线程池进行操作,还有一种就是不传线程池,让程序是使用默认线程池进行操作。...(asyncPool, supplier); } //使用自定义线程池 public static CompletableFuture supplyAsync(Supplier...,这时候实际上就属于异步查询,我们可以写多个查询,比如,上面的代码我们查询是订单,下面我们可以查询用户信息,还是使用同样线程池。...但是这种链式也不是都非常好用,毕竟要控制住线程池,大家记得在使用完成之后,可以把自己创建线程池小回调,调用shutDown方法就可以了。我们再接着往下说。

46210

【小家Java】Future、FutureTask、CompletionService、CompletableFuture解决多线程并发中归集问题效率对比

1.8才提供CompletableFuture简单介绍:: 当一个Future可能需要显示地完成时,使用CompletionStage接口去支持完成时触发函数和操作。...CompletableFuture实现了CompletionStage接口的如下策略: 为了完成当前CompletableFuture接口或者其他完成方法回调函数线程,提供了非异步完成操作 没有显式入参...所有的CompletionStage方法都是独立于其他共有方法实现,因此一个方法行为不会受到子类中其他方法覆盖 CompletableFuture实现了Futurre接口的如下策略: CompletableFuture...,请持续关注我博客 【小家java】Java8新特性之—CompletableFuture系统讲解和实例演示(使用CompletableFuture构建异步应用) Demo: JDK8CompletableFuture...()组装返回一个有返回值CompletableFuture,返回结果get()获取 /** * 多线程并发任务,取结果归集 * * @author fangshixiang@vipkid.com.cn

2.5K32

手把手教你线程池配合CompletableFuture实现图片下载并压缩

Url 列表集合,从而保证每个线程下载属于自己任务,上代码 : // 接上文代码 threadS.stream().map(item -> CompletableFuture.runAsync...走异步方式,遍历 item 如 item=10,也就是线程数为 10,则直接执行 10 次(「有线程前提下」) // 使用CompletableFuture.runAsync 走异步方式,遍历item...// 如item=10,也就是线程数为10,则直接执行10次(有线程前提下) threadS.stream().map(item -> CompletableFuture.runAsync((...,此处是为了线程池中所有线程都结束才能往下走,执行压缩文件步骤,这里提一嘴,如果没有手动赋予线程池,CompletableFuture 默认使用ForkJoinPool.commonPool,会根据电脑核心数来指定...本文从一个实践真实项目场景出发,教大家使用上 CompletableFuture线程池等知识点。

63910
领券