范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java8已经发布7年了,不会还有人没用过CompletableFuture吧

  前言
  CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。  Future有哪些缺陷?
  多线程的场景下,我们要监听每个线程异步执行的结果,如果用Future去实现,代码如下:  /**  * Future异步示例  *  * @author liudong  * @date 2021/12/9 15:37  */ public class FutureDemo {     public static void main(String[] args) throws Exception {         // 1. 创建线程池         ExecutorService executorService = Executors.newCachedThreadPool();         // 2. 提交任务         List> tasks = new ArrayList<>();         ArrayList taskIds = Lists.newArrayList(1, 2, 3);         taskIds.forEach(taskId -> {             Callable task = () -> {                 Thread.sleep(1000);                 return "任务" + taskId + "执行完成!";             };             tasks.add(task);         });         List> futures = executorService.invokeAll(tasks);         // 3. 获取任务执行结果         for (Future future : futures) {             String result = future.get();             System.out.println(result);         }         executorService.shutdown();     } }
  执行结果  任务1执行完毕! 任务2执行完毕! 任务3执行完毕!
  大家有没有思考过这样使用有没有什么问题?笔者认为有如下几个 缺陷 :  (1) 不能回调会阻塞  (2) 批量任务处理彼此依赖会阻塞  (3) 不能多个任务级联执行,将结果依次往下传递  (4) 得不到最先完成的任务  CompletableFuture能解决吗?
  针对如上几个问题,看看CompletableFuture是怎么解决的。
  使用CompletableFuture提供的supplyAsync和whenCompleteAsync两个方法优化以上代码,如下:  /**  * CompletableFuture异步示例  *  * @author liudong  * @date 2021/12/9 15:37  */ public class CompletableFutureDemo {     public static void main(String[] args) throws Exception {         // 1. 创建线程池         ExecutorService executorService = Executors.newCachedThreadPool();         // 2. 提交任务         List> tasks = new ArrayList<>();         ArrayList taskIds = Lists.newArrayList(1, 2, 3);         // 3. 回调任务执行结果         List> completableFutures = new ArrayList<>();         CompletableFuture[] cfs = taskIds.stream().map((taskId) -> {             CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> {                 try {                     Thread.sleep(1000L);                 } catch (InterruptedException e) {                 }                 return "任务" + taskId + "执行完成!";             }, executorService);             // 异步返回执行结果             completableFuture.whenCompleteAsync((result, exception) -> {                 System.out.println(result);             });             // 将处理结果传递到子任务             completableFuture.thenAccept((result) -> {                 System.out.println("上级任务处理结果:" + result);             });             return completableFuture;         }).toArray(CompletableFuture[]::new);                  // 获取最先执行完的任务         CompletableFuture firstEnd = CompletableFuture.anyOf(cfs);         System.out.println("最先执行完的任务:" + firstEnd.get());         executorService.shutdown();     } }
  执行结果:  上级任务处理结果:任务1执行完成! 上级任务处理结果:任务3执行完成! 最先执行完的任务:任务1执行完成! 上级任务处理结果:任务2执行完成! 任务3执行完成! 任务2执行完成! 任务1执行完成!
  以上可以看出,执行结果是异步打印,不会阻塞,也不会顺序依赖,能获取上级任务执行结果,并能够获取到最先执行完的任务。
  扩展知识点:  (1) 创建异步操作:  runAsync:不支持返回值  supplyAsync:支持返回值  (2) 计算结果完成时的回调方法:  whenComplete:执行完当前任务的线程,继续执行 whenComplete 的任务。  whenCompleteAsync:执行完当前任务的线程,把whenCompleteAsync 的任务继续提交给线程池来执行。  exceptionally:当前任务出现异常时,执行exceptionally中的回调方法。  (3) 线程串行化:  thenApply:当一个线程依赖另一个线程时,可以使用 thenApply 方法来把这两个线程串行化。  thenAccept 消费处理结果,接收任务的处理结果,并消费处理,无返回结果。  thenRun:跟 thenAccept 方法不一样的是,不关心任务的处理结果。只要上面的任务执行完成,就开始执行 thenAccept 。  handle:执行任务完成时,handle可以对结果进行处理。handle 方法和 thenApply 方法处理方式基本一样。不同的是 handle 是在任务完成后再执行,还可以处理异常的任务。thenApply 只可以执行正常的任务,任务出现异常则不执行 thenApply 方法。  (4) 合并任务  thenCombine:用于合并任务,thenCombine 会把 两个 CompletionStage 的任务都执行完成后,把两个任务的结果一块交给 thenCombine 来处理。  thenCompose:thenCompose 方法允许你对两个 CompletionStage 进行流水线操作,第一个操作完成时,将其结果作为参数传递给第二个操作。
公知们常挂在嘴边的瑞典发展模式,咋就走不下去了?瑞典在历史上也算是一个强国了,北欧雄狮,只不过现在有人用这个名号更多说的是它的足球。历史上鼎盛时期的瑞典版图不限于现如今的国内区域,周边国家也被他囊括了,甚至势力都不限于北欧了。后动物世界,广州长隆风光在穗多年,第一次去广州长隆野生动物世界,大熊猫,狮子,斑马,老虎,骆驼,大象,长颈鹿,獴哥。公园以大规模野生动物种群放养和自驾车观赏为特色,集动植物的保护研究旅游观赏科普教育为一体动物世界,广州长隆风光在穗多年,第一次去广州长隆野生动物世界,大熊猫,狮子,斑马,老虎,骆驼,大象,长颈鹿,獴哥。公园以大规模野生动物种群放养和自驾车观赏为特色,集动植物的保护研究旅游观赏科普教育为一体东湖冬色,绮丽风光本着休闲的目的,去东湖公园与深圳水库漫步了一圈。由华为Mate40Pro拍摄,部分使用五倍潜望式超长焦。山上的三面菩萨佛像。由华为mate40Pro拍摄于2021年1月2日下午深圳保护海外利益,军队和安保公司如何相辅相成?我们有哪些短板?我们改革开放以后,特别是我们有了一带一路,这意味着确实大量的中国企业,中国公民会走向世界,走出国门,走向这个世界上的各个角落。那这个世界我们知道,其实纷繁复杂,有很多地方是相对发达莫斯科航展和珠海航展相比有哪些不一样的亮点呢?昨天中国珠海航展开幕了,本来是去年举办的但因为新冠疫情所以推迟到了今年,开幕当天一如既往举行了炫技飞行表演。而参展的武器种类更是让人看的目不暇接,用炫目一词更为恰当。那不禁要问了,自己组建了冲锋队,自己又亲手把它清洗掉,希特勒为啥这么做?1934年6月30号希特勒突然用霹雳手段清洗冲锋队,这个事件也被世人称之为迷的一个话题。希特勒是亲手创立所谓冲锋队,在他掌权之后又把它残忍的清洗掉,为什么?这就是所谓的迷,所以我们无论是拿破仑还是希特勒入侵地广人稀的俄罗斯,为何都一败涂地?俄罗斯的历史很多人还是很感兴趣的,毕竟是世界上一个重要很大的一个国家,两个节点,一个节点就是公元1000年古罗斯帝国,其实当时是很落后的,那个相当于中国北宋的时候,我们多发达啊。(今年西瓜为啥普遍都那么贵呢?你实现吃瓜自由了么?很多人说,今年西瓜感觉有点贵是不是?确实有点贵,过去常见的一块钱二块钱的瓜几乎找不到了。真的有时候买一个瓜要花50块钱确实有点舍不得。很多网友就说了那今年大家只能在微博上吃瓜了,去世界第八,韩国潜艇成功试射弹道导弹,军方却为何不敢大方承认?就在本月4号韩国海军张保皋级常规导弹潜艇,首艇岛山安昌浩号成功试射了一枚潜射弹道导弹。韩国媒体称在发射成功后,韩国将成为世界第八个掌握潜射弹道导弹技术的国家。在完成本次潜射导弹试验稀有蓝色车漆涂装1989年法拉利F40展开拍卖F40不仅是车厂为庆祝40周年而推出的车款,更是法拉利创办人EnzoFerrari在一生中所设计出的最后一款跑车,其历史意义与份量是毋庸置疑的,然而除了最为经典的RossoCors
8月20日小米造车地址将公开蔚来车主内讧南北马自达将合并长安马自达增资项目已摘牌南北马自达合并在即据腾讯网报道,日前,于今年6月16日挂牌,披露期满日期延长至8月18日的长安马自达汽车有限公司增资项目已无查询相匹配结果。同时据有接近马自新能源汽车续航再次突破,全面进入700公里时代曾经新能源汽车最受人诟病的就是续航能力,而如今已有多款车型续航能力可达700公里,比如最新款的极狐阿尔法S比亚迪唐EV和红旗EHS9。其它续航700公里的汽车使用的电池都是三元锂电诺基亚7110概念机曝光,前后双屏设计最近诺基亚总是推一些概念机,设计理念都不错的。就是不知道是否真的实现。在众多概念机里面,新诺基亚7110概念设计图被高光,其主打前后双屏幕而且主镜头就达到2亿像素,这个的确是不错的等不到下一款FGO,B站要自己做了文丨阑夕B站刚刚发布了相当亮眼的一份季报,以广告为核心的第二曲线,带动了B站整体营收同比增长72,在复杂多变的监管形势下,B站依然保持了不错的增长。唯独游戏收入没怎么涨,已经过长的小米MIX4手机今天上午10点再次开售,售价4999元起小米MIX4手机今天上午10点再次开售,售价4999元起8GB128GB版本售价4999元8GB256GB版本售价5299元12GB256GB版本售价5799元12GB512GB版6400万骁龙888Plus,5999元起售!仅京东卖出3。5万台价值2个亿自从华为手机由于芯片的产能问题而导致货源不足之后,原本属于华为手机的高端旗舰手机市场份额出现了空缺,很多原本计划购买华为高端旗舰手机的消费者变得有些失落,同时也有部分消费者转而去购贬值率是燃油车3倍新能源车保值率调查根据商务部发布的新能源车销量数据,今年17月国内新能源车销量已经超过2020年全年水平,创历史新高达到了147。8万辆,相信全年销量有望超过240万辆。两年前我们做过一期二手新能源iPhone12在充电时出现闪电接口检测到液体的提示怎么办?在iPhoneXS系列iPhoneXR或更新机型中,苹果为iPhone加入了一条新的充电警告,如果闪电端口存在液体,则iPhone在充电时,屏幕上就会出现相关的警告。该功能主要是避荣耀平板V7Pro到底如何,120Hz高刷打游戏居然不掉帧?平板电脑能否成为真正成为生产力工具,一直都是大家入手之前的必要考虑。作为介于智能手机和PC电脑之间的中间环节,比手机更爽比PC更方便,则是平板电脑的存在价值。今天笔者要给大家分享的小米Mix4评测黑科技担当再次上线,几乎完美的全面屏丨钛极客小米MIX4自从小米推出第一款MIX系产品,就给消费者留下了黑科技的印象,并且也一直在探索如何实现更高屏占比的真全面屏,从前置摄像头下置,到滑盖式升降前置摄像头,到第四代产品终于依华为MateRollable可卷曲手机专利,带有拉出式显示屏近日,华为的可拆卸移动设备已经填补了一项新专利。该信息表明,华为正在计划推出一款新的可卷曲手机,我们可能将其称为华为MateRollable,但尚未得到官方确认。即使在困难时期,华