CompletableFuture异步多线程是真的优雅

  • 电脑网络维修
  • 2024-11-15

当天给大家引见一个十分无心思的Java编程中的奇淫巧技——用CompletableFuture来做异步编程。

先说一下异步编程是啥,以及普通都是什么时刻用他们。

其实大家比拟惯例习气的都是用springboot+ssm+springcloud alibaba技术体系去开发一些web系统,而后外面填充各种crud代码,置信看这篇文章的好友应该都差不多,毕竟天下苦crud久已,进软件开发行业之前感觉很矮小上,出去发现技术都相熟的差不多了,更多的都是在干crud。

那其真实这种惯例性的crud类的系统和技术体系下,普通我们都不须要去做什么并发编程、异步编程之类的,由于普通系统原理都是springboot拉起来一个内嵌的web server,比如tomcat,而后对外接http恳求,多线程并发处置恳求,每个线程都是调用你的controller、service、dao和sql语句,是不是?

而且其实大家往罕用spring的话,一切的spring bean都是做成单例的,而且单例普通都是有形态的,就是大家不会在内存里放什么数据,也就防止了多线程并发的安保疑问,而后我们往常也就不用在crud系统里关注多线程疑问了。

所以其实我们写的代码都是顺序流的形式,来一个恳求,各种业务逻辑处置,调用service,dao,口头各种sql语句,而后最后都是面向数据库做增删改查,所以基本没时机也不须要经常使用并发编程和异步编程。

当然这种形式在crud业务类系统里还是不错的,毕竟繁难,写业务就可以了,不要去关注复杂的多线程并发和异步化的疑问。

所以并发编程和异步编程指的是什么呢?并发编程其实是指比如你写了一个系统,你的系统代码里不是口头那种crud顺序流代码,而是自己搞一个class,承袭Thread,自己成功一个线程类,而后你的系统代码里拿到一个恳求不是间接去crud,而是启动一个Thread线程去并发运转起来,这个线程不就会异步的去口头一些操作了。

只管大家普通真的很少在业务系统里用这种并发编程和异步编程的形式,然而代码里确实是可以这么玩的。

好,那普通什么时刻须要在代码里开一些线程去并发运转,异步化的运转呢?可怜的信息是,crud系统真的很少用,普通其实都是两边件类的系统会少量的运用并发编程的常识,各种恳求都是异步化的口头,比如说大家可以去看看rocketmq、elasticsearch这一类两边件的源码,他们会常罕用到。

或许说大家在自己公司里研发一些非crud类的系统,比如说一些公司内自研的一些底层系统,基础系统,两边件系统,其实也会常罕用到并发编程,也就是异步编程的形式,那假设大家未来有或许用到异步编程的话,倡导还是来了解一下当天的常识点,由于传统的异步编程其实控制你开的那个线程其实真的很费事。

然而用了CompletableFuture之后,对你开进去的多线程并发义务,你其实是可以很好的去控制他们的,一同开局当天的旅程吧。

在Java的环球里,处置异步和多线程义务不时是个让人头疼的疑问。传统的线程创立和治理形式,不只代码繁琐,还容易出错。然而,自从Java 8推出了CompletableFuture这个神器,一切都变得不一样了。它以一种极端优雅的形式,处置了异步编程的诸多痛点。当天,我们就来聊聊这个CompletableFuture,看看它究竟是如何让异步多线程编程变得如此优雅的。

一、异步编程的痛点

在CompletableFuture出现之前,Java的异步编程关键有两种形式:经过Future接口和成功Callable接口。然而,这两种形式都存在一些疑问。

1、阻塞和轮询:经常使用Future.get()方法失掉异步结果时,假设结果还没有预备好,线程会被阻塞。为了防止阻塞,我们通常会经常使用轮询的形式审核结果能否预备好,但这种形式会糜费CPU资源。

2、不可组合多个异步义务:在实践开发中,我们经常须要组合多个异步义务的结果。然而,经常使用传统的Future和Callable,很难成功复杂的异步义务组合逻辑。

3、意外处置不便:当异步义务出现意外时,传统的处置形式是经过Future.get()方法捕捉意外,但这种形式不够灵敏,也不便于异步义务的失误复原。

二、CompletableFuture的优雅之处

CompletableFuture是Java 8引入的一个新的异步编程工具,它处置了传统异步编程形式的诸多痛点,让异步多线程编程变得愈加优雅和方便。

1、非阻塞的异步结果失掉:CompletableFuture提供了非阻塞的异步结果失掉形式。你可以经过thenApply、thenAccept、thenRun等方法,在异步义务成功时口头特定的操作,而无需阻塞线程。

2、灵敏的异步义务组合:CompletableFuture提供了丰盛的API,支持多种异步义务的组合形式。你可以经常使用thenCombine、thenAcceptBoth、runAfterBoth等方法,将两个异步义务的结果启动组合;或许经常使用allOf、anyOf等方法,期待多个异步义务成功。

3、方便的意外处置:CompletableFuture提供了exceptionally方法,用于处置异步义务中出现的意外。你可以在这个方法中定义意外的处置逻辑,使得异步义务的失误复原变得愈加方便。

4、链式调用和流式处置:CompletableFuture的方法调用支持链式操作,你可以将多个异步义务串联起来,构成一个处置流程。这种链式调用和流式处置的形式,使得异步编程的代码愈加繁复和易读。

三、CompletableFuture的经常使用示例

上方,我们经过一些详细的示例,来看看CompletableFuture是如何优雅地处置异步多线程编程的疑问的。

示例1:异步口头义务并失掉结果

CompletableFutureString future  CompletableFuturesupplyAsync  {try {Threadsleep} catch InterruptedException e {eprintStackTrace} }futurethenAcceptSystem::println

在这个示例中,我们经常使用supplyAsync方法异步口头了一个义务,并前往了一个CompletableFuture对象。而后,我们经常使用thenAccept方法,在异步义务成功时打印结果。这种形式防止了阻塞和轮询,使得代码愈加繁复和高效。

示例2:组合多个异步义务的结果

CompletableFutureString future1  CompletableFuturesupplyAsync  CompletableFutureString future2  CompletableFuturesupplyAsync  future1thenCombinefuture2 result1 result2  result1    result2thenAcceptSystem::println

在这个示例中,我们经常使用thenCombine方法将两个异步义务的结果启动了组合。当两个异步义务都成功时,它们的结果会被拼接成一个新的字符串,并打印进去。这种形式使得异步义务的组合变得愈加灵敏和方便。

示例3:处置异步义务中的意外

CompletableFutureString future  CompletableFuturesupplyAsync  {  { // 假定这里有个条件判别,满足时抛出意外throw new RuntimeException} }futureexceptionallyex  thenAcceptSystem::println

在这个示例中,我们经常使用exceptionally方法处置了异步义务中出现的意外。当异步义务抛出意外时,我们会前往一个备用结果,并打印进去。这种形式使得异步义务的失误复原变得愈加容易和可控。

四、CompletableFuture的初级个性

除了上述的基本用法外,CompletableFuture还提供了一些初级个性,进一步增强了其异步编程的才干。

1、自定义线程池:自动状况下,CompletableFuture会经常使用ForkJoinPool.commonPool()作为线程池来口头异步义务。然而,你也可以经过supplyAsync、runAsync等方法的重载版本,自定义线程池来口头异步义务。

2、成功时的回调:CompletableFuture提供了whenComplete、whenCompleteAsync等方法,准许你在异步义务成功时口头特定的回调操作。这些回调操作可以处置反常结果,也可以处置意外状况。

3、结果计算成功时的通知:CompletableFuture还提供了thenRun方法,准许你在异步义务的结果计算成功时口头特定的操作。这个方法不关心异步义务的结果,只关心义务能否成功。

4、期待多个异步义务成功:CompletableFuture提供了allOf、anyOf等静态方法,用于期待多个异步义务成功。allOf会期待一切义务成功,而anyOf则只期待其中一个义务成功。

五、总结

CompletableFuture是Java 8引入的一个弱小的异步编程工具,它以一种极端优雅的形式处置了传统异步编程形式的诸多痛点。经过经常使用CompletableFuture,我们可以愈加方便地成功异步多线程编程,提高代码的可读性和可保养性。同时,CompletableFuture还提供了丰盛的初级个性,进一步增强了其异步编程的才干。因此,假设你还在为异步多线程编程而苦恼,无妨尝试一下CompletableFuture,置信它会给你带来全新的编程体验。

  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/8413.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号